<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://daq00.triumf.ca/DaqWiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Olchansk</id>
	<title>DaqWiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://daq00.triumf.ca/DaqWiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Olchansk"/>
	<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php/Special:Contributions/Olchansk"/>
	<updated>2026-04-22T10:49:23Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.6</generator>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8850</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8850"/>
		<updated>2026-04-17T23:18:30Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Remove obsolete packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
            RequestHeader set X-Remote-User %{REMOTE_USER}s&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
DO NOT DO THIS, IT REMOVES TOO MUCH !!!&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-22 ==&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-24 ==&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-aarch64-linux-gnu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-g++ -c -o xvcserver_cdm.o -O2 -g -Wall -Wuninitialized -std=c++20 xvcserver_cdm.cxx &lt;br /&gt;
aarch64-linux-gnu-g++ -o xvcserver_cdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 xvcserver_cdm.o -pthread -lrt -lutil -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 24.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install gcc-i686-linux-gnu&lt;br /&gt;
apt install g++-i686-linux-gnu&lt;br /&gt;
apt install libstdc++-13-dev:i386&lt;br /&gt;
apt install lib32z1 lib32z1-dev&lt;br /&gt;
i686-linux-gnu-gcc -o ttcp.i386 ttcp.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* executables cross-build on Ubuntu-24 will NOT run on 32-bit Debian-12 (GLIBC mismatch, static executables maybe work)&lt;br /&gt;
* executables cross-build on Ubuntu-24 run on 32-bit Debian-13&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8849</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8849"/>
		<updated>2026-04-16T22:17:39Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Install apache httpd proxy for midas and elog */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
            RequestHeader set X-Remote-User %{REMOTE_USER}s&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
NOTE: do this only if booted into the latest linux kernel - compare &amp;quot;uname -a&amp;quot; with &amp;quot;ls -l /boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-22 ==&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-24 ==&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-aarch64-linux-gnu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-g++ -c -o xvcserver_cdm.o -O2 -g -Wall -Wuninitialized -std=c++20 xvcserver_cdm.cxx &lt;br /&gt;
aarch64-linux-gnu-g++ -o xvcserver_cdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 xvcserver_cdm.o -pthread -lrt -lutil -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 24.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install gcc-i686-linux-gnu&lt;br /&gt;
apt install g++-i686-linux-gnu&lt;br /&gt;
apt install libstdc++-13-dev:i386&lt;br /&gt;
apt install lib32z1 lib32z1-dev&lt;br /&gt;
i686-linux-gnu-gcc -o ttcp.i386 ttcp.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* executables cross-build on Ubuntu-24 will NOT run on 32-bit Debian-12 (GLIBC mismatch, static executables maybe work)&lt;br /&gt;
* executables cross-build on Ubuntu-24 run on 32-bit Debian-13&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8820</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8820"/>
		<updated>2026-04-01T23:50:34Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Register 71 packet error bits */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM i_CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC i_CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM missing, CDM i_CLK_CC_OUT2_P&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_OLD_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
read bits&lt;br /&gt;
 7..0 - clk_config_vec&lt;br /&gt;
    1,0 - CLK_IN_SEL_LS&lt;br /&gt;
    2 - CLK_EXT_SEL_LS&lt;br /&gt;
    3 - disconnected CLK_RSTn_LS&lt;br /&gt;
    4 - CLK_LOSXTn_LS&lt;br /&gt;
    5 - CLK_LOLn_LS&lt;br /&gt;
    6 - CLK_INTn_LS&lt;br /&gt;
    7 - tx_clock_status&lt;br /&gt;
31..8 - 0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
write bits&lt;br /&gt;
 3..2 - clk_config_vec[3..2]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 1 - 0&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_mgt_rst&lt;br /&gt;
 1 - cdm_link_interface i_link_down_latched_rst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 62 | 0x20260401 | CDM | ROL  | vx_rx_hitmap_period latched by cmd_latch, VX ports 0, 1&lt;br /&gt;
 63 | same       | CDM | ROL  | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | ROL  | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | ROL  | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | ROL  | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | ROL  | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
103,104,105 | 0x20260401 | CDM | ROL | vx_rx_hitmap_vx_id_latched | VX ID from VX hitmap packets, VX ports 0..11, in order, latched by cmd_latch&lt;br /&gt;
106 | 0x20260401 | CDM | RW   | conf_vx_rx_hitmap_cumulative_period | period of CDM CUMULATIVE_HITMAP packets, set to 0 to disable them.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 14&lt;br /&gt;
      hitmap_encode_error_latch,     // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      cdm_hitmap_decode_error_latch,          // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
0x86 - 128 bytes - 64 words - 32 dwords - 16 qwords - CDM CUMULATIVE_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x86 - CDM cumulative hitmap packet, 128 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x86&lt;br /&gt;
1 - vx_rx_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - reserved&lt;br /&gt;
11 - reserved&lt;br /&gt;
12 - repeating 12 times the 80-bit VX HITMAP packets: 0x81, VX ID, 64 bits of hitmap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8819</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8819"/>
		<updated>2026-04-01T23:46:49Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* DS20k block register map */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM i_CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC i_CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM missing, CDM i_CLK_CC_OUT2_P&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_OLD_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
read bits&lt;br /&gt;
 7..0 - clk_config_vec&lt;br /&gt;
    1,0 - CLK_IN_SEL_LS&lt;br /&gt;
    2 - CLK_EXT_SEL_LS&lt;br /&gt;
    3 - disconnected CLK_RSTn_LS&lt;br /&gt;
    4 - CLK_LOSXTn_LS&lt;br /&gt;
    5 - CLK_LOLn_LS&lt;br /&gt;
    6 - CLK_INTn_LS&lt;br /&gt;
    7 - tx_clock_status&lt;br /&gt;
31..8 - 0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
write bits&lt;br /&gt;
 3..2 - clk_config_vec[3..2]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 1 - 0&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_mgt_rst&lt;br /&gt;
 1 - cdm_link_interface i_link_down_latched_rst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 62 | 0x20260401 | CDM | ROL  | vx_rx_hitmap_period latched by cmd_latch, VX ports 0, 1&lt;br /&gt;
 63 | same       | CDM | ROL  | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | ROL  | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | ROL  | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | ROL  | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | ROL  | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
103,104,105 | 0x20260401 | CDM | ROL | vx_rx_hitmap_vx_id_latched | VX ID from VX hitmap packets, VX ports 0..11, in order, latched by cmd_latch&lt;br /&gt;
106 | 0x20260401 | CDM | RW   | conf_vx_rx_hitmap_cumulative_period | period of CDM CUMULATIVE_HITMAP packets, set to 0 to disable them.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
0x86 - 128 bytes - 64 words - 32 dwords - 16 qwords - CDM CUMULATIVE_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x86 - CDM cumulative hitmap packet, 128 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x86&lt;br /&gt;
1 - vx_rx_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - reserved&lt;br /&gt;
11 - reserved&lt;br /&gt;
12 - repeating 12 times the 80-bit VX HITMAP packets: 0x81, VX ID, 64 bits of hitmap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8818</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8818"/>
		<updated>2026-04-01T22:33:45Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* GDM, CDM, VX packet communications */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM i_CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC i_CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM missing, CDM i_CLK_CC_OUT2_P&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_OLD_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
read bits&lt;br /&gt;
 7..0 - clk_config_vec&lt;br /&gt;
    1,0 - CLK_IN_SEL_LS&lt;br /&gt;
    2 - CLK_EXT_SEL_LS&lt;br /&gt;
    3 - disconnected CLK_RSTn_LS&lt;br /&gt;
    4 - CLK_LOSXTn_LS&lt;br /&gt;
    5 - CLK_LOLn_LS&lt;br /&gt;
    6 - CLK_INTn_LS&lt;br /&gt;
    7 - tx_clock_status&lt;br /&gt;
31..8 - 0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
write bits&lt;br /&gt;
 3..2 - clk_config_vec[3..2]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 1 - 0&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_mgt_rst&lt;br /&gt;
 1 - cdm_link_interface i_link_down_latched_rst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 62 | 0x20260401 | CDM | ROL  | vx_rx_hitmap_period latched by cmd_latch, VX ports 0, 1&lt;br /&gt;
 63 | same       | CDM | ROL  | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | ROL  | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | ROL  | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | ROL  | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | ROL  | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
103,104,105 | 0x20260104 | CDM | ROL | vx_rx_hitmap_vx_id_latched | VX ID from VX hitmap packets, VX ports 0..11, in order, latched by cmd_latch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
0x86 - 128 bytes - 64 words - 32 dwords - 16 qwords - CDM CUMULATIVE_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x86 - CDM cumulative hitmap packet, 128 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x86&lt;br /&gt;
1 - vx_rx_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - reserved&lt;br /&gt;
11 - reserved&lt;br /&gt;
12 - repeating 12 times the 80-bit VX HITMAP packets: 0x81, VX ID, 64 bits of hitmap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8817</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8817"/>
		<updated>2026-04-01T17:42:58Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* DS20k block register map */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM i_CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC i_CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM missing, CDM i_CLK_CC_OUT2_P&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_OLD_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
read bits&lt;br /&gt;
 7..0 - clk_config_vec&lt;br /&gt;
    1,0 - CLK_IN_SEL_LS&lt;br /&gt;
    2 - CLK_EXT_SEL_LS&lt;br /&gt;
    3 - disconnected CLK_RSTn_LS&lt;br /&gt;
    4 - CLK_LOSXTn_LS&lt;br /&gt;
    5 - CLK_LOLn_LS&lt;br /&gt;
    6 - CLK_INTn_LS&lt;br /&gt;
    7 - tx_clock_status&lt;br /&gt;
31..8 - 0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
write bits&lt;br /&gt;
 3..2 - clk_config_vec[3..2]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 1 - 0&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_mgt_rst&lt;br /&gt;
 1 - cdm_link_interface i_link_down_latched_rst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 62 | 0x20260401 | CDM | ROL  | vx_rx_hitmap_period latched by cmd_latch, VX ports 0, 1&lt;br /&gt;
 63 | same       | CDM | ROL  | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | ROL  | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | ROL  | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | ROL  | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | ROL  | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
103,104,105 | 0x20260104 | CDM | ROL | vx_rx_hitmap_vx_id_latched | VX ID from VX hitmap packets, VX ports 0..11, in order, latched by cmd_latch&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8816</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8816"/>
		<updated>2026-03-28T01:45:28Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 3 GDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM i_CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC i_CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM missing, CDM i_CLK_CC_OUT2_P&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_OLD_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
read bits&lt;br /&gt;
 7..0 - clk_config_vec&lt;br /&gt;
    1,0 - CLK_IN_SEL_LS&lt;br /&gt;
    2 - CLK_EXT_SEL_LS&lt;br /&gt;
    3 - disconnected CLK_RSTn_LS&lt;br /&gt;
    4 - CLK_LOSXTn_LS&lt;br /&gt;
    5 - CLK_LOLn_LS&lt;br /&gt;
    6 - CLK_INTn_LS&lt;br /&gt;
    7 - tx_clock_status&lt;br /&gt;
31..8 - 0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
write bits&lt;br /&gt;
 3..2 - clk_config_vec[3..2]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 1 - 0&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_mgt_rst&lt;br /&gt;
 1 - cdm_link_interface i_link_down_latched_rst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8815</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8815"/>
		<updated>2026-03-28T00:56:07Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Clock distribution Rev1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM i_CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC i_CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM missing, CDM i_CLK_CC_OUT2_P&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_OLD_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
read bits&lt;br /&gt;
 7..0 - clk_config_vec&lt;br /&gt;
    1,0 - CLK_IN_SEL_LS&lt;br /&gt;
    2 - CLK_EXT_SEL_LS&lt;br /&gt;
    3 - disconnected CLK_RSTn_LS&lt;br /&gt;
    4 - CLK_LOSXTn_LS&lt;br /&gt;
    5 - CLK_LOLn_LS&lt;br /&gt;
    6 - CLK_INTn_LS&lt;br /&gt;
    7 - tx_clock_status&lt;br /&gt;
31..8 - 0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
write bits&lt;br /&gt;
 3..2 - clk_config_vec[3..2]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 1 - 0&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_mgt_rst&lt;br /&gt;
 1 - cdm_link_interface i_link_down_latched_rst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8814</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8814"/>
		<updated>2026-03-28T00:55:43Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Clock distribution Rev1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM i_CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC i_CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM missing, CDM i_CLK_CC_OUT2_P&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
read bits&lt;br /&gt;
 7..0 - clk_config_vec&lt;br /&gt;
    1,0 - CLK_IN_SEL_LS&lt;br /&gt;
    2 - CLK_EXT_SEL_LS&lt;br /&gt;
    3 - disconnected CLK_RSTn_LS&lt;br /&gt;
    4 - CLK_LOSXTn_LS&lt;br /&gt;
    5 - CLK_LOLn_LS&lt;br /&gt;
    6 - CLK_INTn_LS&lt;br /&gt;
    7 - tx_clock_status&lt;br /&gt;
31..8 - 0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
write bits&lt;br /&gt;
 3..2 - clk_config_vec[3..2]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 1 - 0&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_mgt_rst&lt;br /&gt;
 1 - cdm_link_interface i_link_down_latched_rst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8813</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8813"/>
		<updated>2026-03-27T21:26:39Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 2 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
read bits&lt;br /&gt;
 7..0 - clk_config_vec&lt;br /&gt;
    1,0 - CLK_IN_SEL_LS&lt;br /&gt;
    2 - CLK_EXT_SEL_LS&lt;br /&gt;
    3 - disconnected CLK_RSTn_LS&lt;br /&gt;
    4 - CLK_LOSXTn_LS&lt;br /&gt;
    5 - CLK_LOLn_LS&lt;br /&gt;
    6 - CLK_INTn_LS&lt;br /&gt;
    7 - tx_clock_status&lt;br /&gt;
31..8 - 0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
write bits&lt;br /&gt;
 3..2 - clk_config_vec[3..2]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 1 - 0&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_mgt_rst&lt;br /&gt;
 1 - cdm_link_interface i_link_down_latched_rst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8812</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8812"/>
		<updated>2026-03-27T21:26:09Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 2 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
read bits&lt;br /&gt;
 7..0 - clk_config_vec&lt;br /&gt;
    1,0 - CLK_IN_SEL_LS&lt;br /&gt;
    2 - CLK_EXT_SEL_LS&lt;br /&gt;
    3 - disconnected CLK_RSTn_LS&lt;br /&gt;
    4 - CLK_LOSXTn_LS&lt;br /&gt;
    5 - CLK_LOLn_LS&lt;br /&gt;
    6 - CLK_INTn_LS&lt;br /&gt;
    7 - tx_clock_status&lt;br /&gt;
31..8 - 0 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
write bits&lt;br /&gt;
 3..2 - clk_config_vec[3..2]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 1 - 0&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_mgt_rst&lt;br /&gt;
 1 - cdm_link_interface i_link_down_latched_rst&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - cdm_link_interface i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8811</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8811"/>
		<updated>2026-03-27T21:14:25Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 2 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
* reg 0&lt;br /&gt;
* reg 1&lt;br /&gt;
* reg 2 - RW&lt;br /&gt;
* reg 3 - RW&lt;br /&gt;
* reg 4 - RO&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 0 - sfp_mod_present&lt;br /&gt;
 1 - sfp_rx_los&lt;br /&gt;
 2 - link_power_good&lt;br /&gt;
 3 - rx_link_up&lt;br /&gt;
 4 - rx_receiving_data&lt;br /&gt;
 5 - rx_error&lt;br /&gt;
 6 - rx_link_up_and_running&lt;br /&gt;
 7 - tx_link_up&lt;br /&gt;
 8 - tx_sending_data&lt;br /&gt;
 9 - tx_link_up_and_running&lt;br /&gt;
10 - link_up_and_running&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reg 5 - RO - CDM SFP debug_data&lt;br /&gt;
* reg 6 - 0&lt;br /&gt;
* reg 7 - 0&lt;br /&gt;
* reg 8 - 0&lt;br /&gt;
* reg 9 - 0&lt;br /&gt;
* reg 10 - 0&lt;br /&gt;
* reg 11 - 0&lt;br /&gt;
* reg 12 - frequency AXI clock&lt;br /&gt;
* reg 13 - freq clk_50MHz&lt;br /&gt;
* reg 14 - freq clk_100MHz&lt;br /&gt;
* reg 15 - freq clk_200MHz&lt;br /&gt;
* reg 16 - freq clk_xo_125 - DS-DM 125 MHz oscillator&lt;br /&gt;
* reg 17 - freq clk_cc_out0 - C.C. 125 MHz output&lt;br /&gt;
* reg 18 - CDM SFP mgt_rx_ref_clk_raw&lt;br /&gt;
* reg 19 - CDM SFP mgt_tx_ref_clk_raw&lt;br /&gt;
* reg 20 - rx_clk_mgt, 125 MHz CDM SFP RX recovered clock&lt;br /&gt;
* reg 21 - rx_clk, 125 MHz, switched between clk_xo_125 and rx_clk_mgt&lt;br /&gt;
* reg 22 - tx_clk, 125 MHz&lt;br /&gt;
* reg 23 - spare&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8810</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8810"/>
		<updated>2026-03-27T20:47:56Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Clock distribution Rev1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
disconnected &amp;lt;- OLD_CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- XDC o_CLK_CC_IN &amp;lt;- VHDL CDM o_CLK_CC_IN SFP o_mgt_rx_rec_clk&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8809</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8809"/>
		<updated>2026-03-27T18:35:27Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Clock distribution Rev1 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; clk_xo_125. not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; CDM SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- CLK_CC_IN1, rx_clk_mgt, SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; GDM QSFP RX and TX ref clock, CDM rx_clk mux&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1 &amp;lt;- VHDL rx_clk_mgt&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8808</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8808"/>
		<updated>2026-03-27T00:35:31Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* ds20k block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_we,&lt;br /&gt;
   input wire register_re,&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8807</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8807"/>
		<updated>2026-03-27T00:23:45Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* ds20k block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   input wire 		        qsfp_tx_data_ready,&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_data_is_k,&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx_async,&lt;br /&gt;
   input wire [3:0] vx2_rx_async,  &lt;br /&gt;
   input wire [3:0] vx3_rx_async,  &lt;br /&gt;
   input wire [3:0] vx4_rx_async,  &lt;br /&gt;
   input wire [3:0] vx5_rx_async,  &lt;br /&gt;
   input wire [3:0] vx6_rx_async,  &lt;br /&gt;
   input wire [3:0] vx7_rx_async,  &lt;br /&gt;
   input wire [3:0] vx8_rx_async,&lt;br /&gt;
   input wire [3:0] vx9_rx_async,  &lt;br /&gt;
   input wire [3:0] vx10_rx_async,&lt;br /&gt;
   input wire [3:0] vx11_rx_async,&lt;br /&gt;
   input wire [3:0] vx12_rx_async,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   //    VX serial comunications&lt;br /&gt;
   input wire [11:0] vx_rx_ser_in,&lt;br /&gt;
   output reg [11:0] vx_tx_ser_out,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8806</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8806"/>
		<updated>2026-03-27T00:17:51Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 2 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - CDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8805</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8805"/>
		<updated>2026-03-27T00:17:28Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 2 GDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x1000+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8804</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8804"/>
		<updated>2026-03-27T00:16:48Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 1 GDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - GDM registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8803</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8803"/>
		<updated>2026-03-27T00:15:28Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 0 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8802</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8802"/>
		<updated>2026-03-27T00:15:17Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 0 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0800+4*i - CDM AXI clock registers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8801</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8801"/>
		<updated>2026-03-27T00:14:45Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 0 GDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x0000+4*i - GDM AXI clock registers&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8800</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8800"/>
		<updated>2026-03-27T00:13:18Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 4 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x2800+4*i - CDM SFP data link registers:&lt;br /&gt;
* 0 - R/W&lt;br /&gt;
** bit  0 - 0x1 - reset&lt;br /&gt;
** bits 7..1 - not used&lt;br /&gt;
** bits 9..8 - data_mode: 00: data from ds20k block, 01: tx_data_cnt, 10: tx_data_prbs, 11: tx_fixed_pattern_data&lt;br /&gt;
** bits 15..10 - not used&lt;br /&gt;
** bits 31..16 - fixed pattern data&lt;br /&gt;
* 1 - RO - o_error_time&lt;br /&gt;
* 2 - RO - o_error_count&lt;br /&gt;
* 3, etc - not used&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8799</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8799"/>
		<updated>2026-03-27T00:07:24Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 6 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_4(0) &amp;lt;= register_data_in_block_4(0);&lt;br /&gt;
  CDM_link_data_processing_inst : CDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_4(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_4(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_4(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_4(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_4(2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_mgt_data_link       =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link       =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_rx_data_clk         =&amp;gt; rx_clk_mgt,  -- rx_clk&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data,&lt;br /&gt;
             o_tx_data_clk         =&amp;gt; tx_clk, --goal is to have one synchronous rx and tx clock (i.e. o_data_clock), will be changed once tested and verified&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data);&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_4_gen : for i in 3 to nregisters_block_4-1 generate&lt;br /&gt;
    register_data_out_block_4(i) &amp;lt;= register_data_in_block_4(i);&lt;br /&gt;
  end generate set_reg_block_4_gen;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+4*i : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8798</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8798"/>
		<updated>2026-03-27T00:07:05Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 6 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_4(0) &amp;lt;= register_data_in_block_4(0);&lt;br /&gt;
  CDM_link_data_processing_inst : CDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_4(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_4(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_4(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_4(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_4(2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_mgt_data_link       =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link       =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_rx_data_clk         =&amp;gt; rx_clk_mgt,  -- rx_clk&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data,&lt;br /&gt;
             o_tx_data_clk         =&amp;gt; tx_clk, --goal is to have one synchronous rx and tx clock (i.e. o_data_clock), will be changed once tested and verified&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data);&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_4_gen : for i in 3 to nregisters_block_4-1 generate&lt;br /&gt;
    register_data_out_block_4(i) &amp;lt;= register_data_in_block_4(i);&lt;br /&gt;
  end generate set_reg_block_4_gen;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3000+i*4 : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8797</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8797"/>
		<updated>2026-03-27T00:06:52Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Block 6 CDM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_4(0) &amp;lt;= register_data_in_block_4(0);&lt;br /&gt;
  CDM_link_data_processing_inst : CDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_4(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_4(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_4(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_4(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_4(2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_mgt_data_link       =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link       =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_rx_data_clk         =&amp;gt; rx_clk_mgt,  -- rx_clk&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data,&lt;br /&gt;
             o_tx_data_clk         =&amp;gt; tx_clk, --goal is to have one synchronous rx and tx clock (i.e. o_data_clock), will be changed once tested and verified&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data);&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_4_gen : for i in 3 to nregisters_block_4-1 generate&lt;br /&gt;
    register_data_out_block_4(i) &amp;lt;= register_data_in_block_4(i);&lt;br /&gt;
  end generate set_reg_block_4_gen;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
* 0x3800+i*4 : DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8796</id>
		<title>DS-DM</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DS-DM&amp;diff=8796"/>
		<updated>2026-03-27T00:02:09Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* ds20k block */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= DS-DM =&lt;br /&gt;
&lt;br /&gt;
DarkSide-20k Global and Crate Data Manager board (GDM and CDM).&lt;br /&gt;
&lt;br /&gt;
Global Data Manager (GDM):&lt;br /&gt;
* clock distribution to CDM boards (including GPS/atomic clock source)&lt;br /&gt;
* collection of trigger data from CDM boards, processing and distribution of trigger decision to CDM boards&lt;br /&gt;
* run control&lt;br /&gt;
* integration with GPS 10MHz and 1pps clocks and GPS/IRIG date and time information&lt;br /&gt;
&lt;br /&gt;
Crate Data Manager (CDM):&lt;br /&gt;
* clock distribution from GDM to CAEN VX digitizers&lt;br /&gt;
* receive trigger data from CAEN VX digitizers&lt;br /&gt;
* send trigger data to GDM&lt;br /&gt;
* run control and dead time control&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://dsdaqgw.triumf.ca/vslice/ - vertical slice DAQ at TRIUMF&lt;br /&gt;
* https://daq00.triumf.ca/DaqWiki/index.php/DarkSide - this DS-DAQ Wiki page&lt;br /&gt;
* https://dsvslice.triumf.ca/vx_napoli - DS vertical slice at TRIUMF&lt;br /&gt;
* https://edev-group.triumf.ca/hw/vme/dark-side-20k-data-manager-card/rev0 - DS-DM board Rev0&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/cdm-gdm-data-manager-vme-cards/rev1 - DS-DM board Rev1&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/ds593 - Xilinx Platform Cable USB II&lt;br /&gt;
* https://www.enclustra.com/en/products/system-on-chip-modules/mercury-xu8/ - Enclustra&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/phasemeasurement - VX Phase measurement script&lt;br /&gt;
* https://daq00.triumf.ca/daqinv/frontend/list/178 - inventory database&lt;br /&gt;
* https://daq00.triumf.ca/elog-ds/DS-DAQ - DS-DAQ elog&lt;br /&gt;
* https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0 - GPS and Rb Clock adapter board&lt;br /&gt;
&lt;br /&gt;
= Git repos =&lt;br /&gt;
&lt;br /&gt;
* dsdmdev@dsdaqgw.triumf.ca:git/gcdm.git - git repository, DS-DM firmware, branch develop_ko2, contact K.O. for ssh key access&lt;br /&gt;
* https://edev-group.triumf.ca/fw/exp/darkside/gcdm - git repository, DS-DM firmware (broken, do not use)&lt;br /&gt;
* https://bitbucket.org/team-ds-dm/ds-dm-software - git repository, DS-DM MIDAS frontend&lt;br /&gt;
* https://bitbucket.org/ttriumfdaq/dsproto_vx2740/src/develop/ - VX DSFE MIDAS frontend&lt;br /&gt;
* https://openproject.triumf.ca/svn/darkside-20k/ - VX firmware project&lt;br /&gt;
&lt;br /&gt;
= Onboard hardware =&lt;br /&gt;
&lt;br /&gt;
* jtag chain: arm_dap_0 0x5BA00477, xczu4_1 0x04721093&lt;br /&gt;
* Eclustra Mercury+ XU8 module: ME-XU8-4CG-1E-D11E-R2.1&lt;br /&gt;
** Xilinx® Zynq Ultrascale+™ MPSoC XCZU4CG-1FBVB900E&lt;br /&gt;
** DDR4 ECC SDRAM (PS) 2 GB&lt;br /&gt;
** DDR4 SDRAM (PL) 1GB&lt;br /&gt;
* ethernet mac chip: AT24MAC402-SSHM-T (&amp;quot;602&amp;quot; chip is wrong)&lt;br /&gt;
* USB UART for Enclustra serial console, micro-USB, 115200n8&lt;br /&gt;
* clock chip: SI5394A-A-GM and oscillator CS-044-054.0M (54 MHz)&lt;br /&gt;
* U23 3.3V current meter and thermometer, LTC2990IMS#TRPBF&lt;br /&gt;
* LEDs:&lt;br /&gt;
** LED_FP A/B/C/D 0/1/2/3&lt;br /&gt;
** led1 - 3V3_SW_ON, SOM_POWER_GOOD - Enclustra FPGA module 3.3V power is good&lt;br /&gt;
** led2 - LTM4624 PGOOD&lt;br /&gt;
** led3 - FPGA_DONE - FPGA has booted&lt;br /&gt;
** led4 - TP-S-1, PCLK_P &lt;br /&gt;
** led5 - TP-S-2, PCLK_N&lt;br /&gt;
* LEMO connectors (top to bottom)&lt;br /&gt;
** J4 - input (NIM/TTL) (EXT_IN_LV(1), EXT_IN_LV(2))&lt;br /&gt;
** J5 - input (NIM/TTL) (EXT_IN_LV(3), EXT_IN_LV(4))&lt;br /&gt;
** J6 - external clock (GPS 10MHz and PPS)&lt;br /&gt;
** J7 - output (NIM/TTL) (EXT_OUT(1), EXT_OUT(2))&lt;br /&gt;
* SMA connectors&lt;br /&gt;
** J9, J10 - CLK_CCA from U6 C.C.&lt;br /&gt;
** J11, J12 - CLK_TP0&lt;br /&gt;
* RJ45 ethernet connector (100mbit: green light on, yellow light flashes when there is traffic)&lt;br /&gt;
* SFP connector (SFP is FTLF8526P3BNL, 6 Gbit/sec, 850 nm, 300m 50/125um OM3 MMF)&lt;br /&gt;
* 4 QSFP connectors (GDM)&lt;br /&gt;
* 6 VX connectors (CDM)&lt;br /&gt;
&lt;br /&gt;
= Buttons, jumpers and switches =&lt;br /&gt;
&lt;br /&gt;
Buttons:&lt;br /&gt;
&lt;br /&gt;
* PB1 - HRST - reboot FPGA (power-on reset)&lt;br /&gt;
* PB2 - SRST - (SRSTn) - reboot ARM CPU&lt;br /&gt;
&lt;br /&gt;
Switches:&lt;br /&gt;
&lt;br /&gt;
* SW1 - boot mode BM0, BM1 [--&amp;gt;]&lt;br /&gt;
* SW2 - LEMO output NIM&amp;lt;-&amp;gt;TTL&lt;br /&gt;
* SW3 - LEMO input 1 and 2 NIM/TTL&lt;br /&gt;
* SW4 - LEMO input 2 and 4 NIM/TTL&lt;br /&gt;
* SW5 - LEMO clock input NIM/TTL&lt;br /&gt;
* SW6 - serial console select. [PS&amp;lt;--PL] PS is ARM CPU, PL is FPGA.&lt;br /&gt;
&lt;br /&gt;
= Front panel =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
| top&lt;br /&gt;
|&lt;br /&gt;
| LED-FP1 | LED_FP(0,1,2,3)&lt;br /&gt;
|&lt;br /&gt;
| SFP J???&lt;br /&gt;
|&lt;br /&gt;
| LEMO J4-LEFT, J4-RIGHT | EXT_IN_LV(1), EXT_IN_LV(2)&lt;br /&gt;
| LEMO J5-LEFT, J5-RIGHT | EXT_IN_LV(3), EXT_IN_LV(4)&lt;br /&gt;
| LEMO J6-LEFT, J6-RIGHT | CLK_EXT1, CLK_EXT0 (125 MHz only) &lt;br /&gt;
| LEMO J7-LEFT, J7-RIGHT | EXT_OUT(1), EXT_OUT(2)&lt;br /&gt;
|&lt;br /&gt;
| J-VX-1&lt;br /&gt;
| J-VX-2 or QSFP-1&lt;br /&gt;
| J-VX-3 or QSFP-2&lt;br /&gt;
| J-VX-4 or QSFP-3&lt;br /&gt;
| J-VX-5 or QSFP-4&lt;br /&gt;
| J-VX-6&lt;br /&gt;
|&lt;br /&gt;
| RJ45 J3 ethernet&lt;br /&gt;
|&lt;br /&gt;
| bottom&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= VX adapter board =&lt;br /&gt;
&lt;br /&gt;
LVDS I/O connector&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
34 pin connector: 0|:::: :::: :::: :::: :|15,16 n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== split-cable connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 .. 7 -&amp;gt; N/C&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX_RX(3) - not used&lt;br /&gt;
9 -&amp;gt; VX_RX(2) - busy VX to CDM&lt;br /&gt;
10 -&amp;gt; VX_RX(1) - DS20K 125 MHz serial data VX to CDM&lt;br /&gt;
11 -&amp;gt; VX_RX(0) - DS20K 62.5MHz clock VX to CDM&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX_TX(0) - TRG CDM to VX&lt;br /&gt;
13 &amp;lt;- VX_TX(1) - TSM CDM to VX, to be VETO CDM to VX&lt;br /&gt;
14 &amp;lt;- VX_TX(2) (set by jumper routed here or to VX CLKIN SYNC) - 125 MHz serial data CDM to VX&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK) - 62.5 MHz clock CDM to VX&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== one-to-one connection ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 -&amp;gt; VX2_RX(3)&lt;br /&gt;
1 -&amp;gt; VX2_RX(2)&lt;br /&gt;
2 -&amp;gt; VX2_RX(0)&lt;br /&gt;
3 -&amp;gt; VX2_RX(1)&lt;br /&gt;
&lt;br /&gt;
4 &amp;lt;- CLK&lt;br /&gt;
5 &amp;lt;- VX2_TX(0)&lt;br /&gt;
6 &amp;lt;- VX2_TX(1)&lt;br /&gt;
7 &amp;lt;- VX2_TX(2)&lt;br /&gt;
&lt;br /&gt;
8 -&amp;gt; VX1_RX(3)&lt;br /&gt;
9 -&amp;gt; VX1_RX(2)&lt;br /&gt;
10 -&amp;gt; VX1_RX(1)&lt;br /&gt;
11 -&amp;gt; VX1_RX(0)&lt;br /&gt;
&lt;br /&gt;
12 &amp;lt;- VX1_TX(0)&lt;br /&gt;
13 &amp;lt;- VX1_TX(1)&lt;br /&gt;
14 &amp;lt;- VX1_TX(2) (set by jumper routed here or to VX CLKIN SYNC)&lt;br /&gt;
15 &amp;lt;- n/c (CLK routed to VX CLKIN CLK)&lt;br /&gt;
&lt;br /&gt;
16 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev0 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev0.PDF]]&lt;br /&gt;
* note: FPGA pin annotations (&amp;quot;IO&amp;quot;, &amp;quot;SCLK&amp;quot;, &amp;quot;PCLK&amp;quot;, etc) on the schematics are bogus, instead, trace them to the FPGA pins.&lt;br /&gt;
* note: ENC A is J800, ENC B is J801, ENC C is J900 (schematic name to enclustra name)&lt;br /&gt;
* note: Enclustra special pins: &amp;quot;GC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;HDGC&amp;quot; is &amp;quot;clock capable&amp;quot;, &amp;quot;MGTREFCLK&amp;quot; is MGT reference clocks.&lt;br /&gt;
* board modifications:&lt;br /&gt;
** ethernet mac chip&lt;br /&gt;
** NIM output (no U15, etc)&lt;br /&gt;
** RJ45 wrong pinout (board mod or special ethernet cable)&lt;br /&gt;
** 125 MHz clock mods (TBW)&lt;br /&gt;
** disconnect QSFP0_SEL from SFP_RS0 and QSFP1_SEL from SFP_RS1, these signals are not used by modern SFPs&lt;br /&gt;
** provide SFP i2c modsel to allow SFP and QSFP at the same time on address 0x50&lt;br /&gt;
&lt;br /&gt;
= Board schematics Rev1 =&lt;br /&gt;
&lt;br /&gt;
* [[File:SCH-DS-xDM-Rev1.PDF]]&lt;br /&gt;
* ENC-A is J800, ENC-B is J801, ENC-C is J900&lt;br /&gt;
* modifications from Rev0:&lt;br /&gt;
* clocks:&lt;br /&gt;
** 125MHz osc: CLK_XO_125, CLK3_XO_125 (CLK2_XO_125 removed)&lt;br /&gt;
** C.C. in2 is CLK_CC_IN from ENC-C142,144&lt;br /&gt;
** C.C. out0 via CLK_A to CLK_CC_OUT0 (ENC-C3,5), CLK_CC_OUT1 (ENC-B3,5), CLK_CC_OUT2 (ENC-C151,153)&lt;br /&gt;
* RTC chip: TP_S pins gone, RTC_I2C_SCL, RTC_I2C_SDA, RTC_1PPS and RTC_32KHZ added&lt;br /&gt;
** RTC_1Hz ENC-C160 pull up 10k to 3.3V&lt;br /&gt;
** RTC_32k ENC-B129 pull up 10k to 1.8V&lt;br /&gt;
* QSFP, SFP control lines:&lt;br /&gt;
** HW_ID_xDM ENC-B131 gone, reused as SFP_ModPrsN&lt;br /&gt;
** SFP_ModPrsN (MOD_ABS) ENC-B131 input (no pulls)&lt;br /&gt;
** SFP_TX_fault (was QSFP2_SEL) QSFP_ModPrsN ENC-C157 input (no pulls)&lt;br /&gt;
** SFP_TX_disable from QSFP_LPMode ENC-C163 output (pull up 10k to 3.3V)&lt;br /&gt;
** SFP_ModDet n/c (was QSFP_ModPrsN) renamed SFP_ModPrsN input&lt;br /&gt;
** SFP_RX_LOS to QSFP_IntN ENC-C159 input (pull up 2k2 to 3.3V)&lt;br /&gt;
** SFP_RS0, SFP_RS1 n/c, assembly option: floating&lt;br /&gt;
** QSFP_ResetN - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL - FPGA outputs, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_LPmode - FPGA output, pull up 10k to 3.3V&lt;br /&gt;
** QSFP_ModPrsN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
** QSFP_IntN - ??? - pull up 2k2 to 3.3V&lt;br /&gt;
* VX_TX and VX_RX reassigned for better length matching&lt;br /&gt;
* cosmetic changes:&lt;br /&gt;
** front panel USB-C connector (replaces Micro-USB)&lt;br /&gt;
** (reset push button PB1 PORn ENC-A132 aka PS_POR_B aka PS_POR#)&lt;br /&gt;
** (reset push button PB2 SRSTn ENC-A124 aka PS_SRST_B aka PS_SRST#)&lt;br /&gt;
** front panel PB3 HRSTn same as PB1&lt;br /&gt;
* Enclustra errata:&lt;br /&gt;
** possible cross talk between pins AA2 (J801-B90, VX9_RX2) and AE3 (J801-B129, RTC_32KHZ). no RTC on the CDM.&lt;br /&gt;
** ethernet link up failure (see Microchip KSZ9031 errata)&lt;br /&gt;
&lt;br /&gt;
= FPGA MGT blocks =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
* SFP - ENC B45,B47 and B48,B50 - FPGA D5,D6 MGTHTX0_D and D1,D2 MGTHRX0_D&lt;br /&gt;
* QSFP0 TX0 - ENC C13,C17 - FPGA H5,H6 MGTHTX0_C&lt;br /&gt;
* QSFP0 TX1 - ENC C21,C25 - FPGA G7,G8 MGTHTX1_C&lt;br /&gt;
* QSFP0 TX2 - ENC C29,C23 - FPGA F5,F6 MGTHTX2_C&lt;br /&gt;
* QSFP1 TX0 - ENC C37,C41 - FPGA E7,E8 MGTHTX3_C&lt;br /&gt;
* QSFP1 TX1 - ENC C45,C47 - FPGA P5,P6 MGTHTX0_B&lt;br /&gt;
* QSFP1 TX2 - ENC C51,C53 - FPGA M5,M6 MGTHTX1_B&lt;br /&gt;
* QSFP2 TX0 - ENC C57,C59 - FPGA L3,L4 MGTHRX2_B&lt;br /&gt;
* QSFP2 TX1 - ENC C63,C65 - FPGA K5,K6 MGTHTX3_B&lt;br /&gt;
* QSFP2 TX2 - ENC C75,C77 - FPGA W3,W4 MGTHTX0_A&lt;br /&gt;
* QSFP3 TX0 - ENC C79,C81 - FPGA V5,V6 MGTHTX1_A&lt;br /&gt;
* QSFP3 TX1 - ENC C85,C87 - FPGA T5,T6 MGTHRX2_A&lt;br /&gt;
* QSFP3 TX2 - ENC C89,C91 - FPGA R3,R4 MGTHTX3_A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev0 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock, QSFP RX and TX ref clock (this is not final design!)&lt;br /&gt;
* (disconnected) 125 MHz osc -&amp;gt; CLK2_XO_125 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* (disconnected) C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- MGTREFCLK0_D &amp;lt;- SFP RX clock (cannot be used because of uncontrollable phase)&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK2_XO_125 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- SFP RX recovered 125 MHz clock&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock (final design)&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
proposed changes:&lt;br /&gt;
* add C.C. 125 MHz -&amp;gt; new CLK_CC_OUT2 (old CLK2_XO_125) -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
* change C.C. in2 &amp;lt;- new CLK_CC_IN &amp;lt;- FPGA AK8,AK9 (non-GC)&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R7,R8 MGTREFCLK0_A (not used)&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J7,J8 MGTREFCLK1_B -&amp;gt; SFP RX reference clock, QSFP RX and TX reference clocks (not final design!)&lt;br /&gt;
  q3 -&amp;gt; disconnected on the board, was CLK2_XO_125 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC)&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (presumably GPS 10 MHz ref clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- (was: CLK_CC_IN &amp;lt;- ENC B10,B12 &amp;lt;- FPGA D9,D10 MGTREFCLK0_D &amp;lt;- SFP RX clock, 125 MHz)&lt;br /&gt;
in2 &amp;lt;- CLK2_XO_125 &amp;lt;- ENC C151,B153 &amp;lt;- FPGA AG8,AH8 (GC) &amp;lt;- mgt_link_data_to_processing.rx_data_clk (SFP RX data clock, 125 MHz)&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3-5 -&amp;gt; FPGA L7,L8 MGTREFCLK0_B -&amp;gt; QSFP RX and TX reference clocks (final design)&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3-5 -&amp;gt; FPGA B9,B10 MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; not used&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 - FPGA N7,N8 MGTREFCLK1_A - ENC C69,C71 - DS-DM SMA J11, J12 (NOT IN CDM PROJECT)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&lt;br /&gt;
Proposed modifications:&lt;br /&gt;
- CLK_CC_IN: from FPGA output pin (ENC C142,C144 - FPGA AK8,AK9) to clock cleaner in2 (instead of CLK2_XO_125 pins)&lt;br /&gt;
- CLK_CCA -&amp;gt; U12 -&amp;gt; currently unused out3 -&amp;gt; CLK2_XO_125 FPGA pins&lt;br /&gt;
- repurpose CLK_EXT0 at GPS 1pps/IRIG input to FPGA&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock distribution Rev1 =&lt;br /&gt;
&lt;br /&gt;
Simplified:&lt;br /&gt;
&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK_XO_125 -&amp;gt; MGTREFCLK0_A -&amp;gt; not used&lt;br /&gt;
* 125 MHz osc -&amp;gt; CLK3_XO_125 -&amp;gt; MGTREFCLK1_B -&amp;gt; SFP RX ref clock&lt;br /&gt;
* 125 MHz osc -&amp;gt; C.C. in1&lt;br /&gt;
&lt;br /&gt;
* C.C. in0 &amp;lt;- CLK_EXT1 (10 MHz GPS clock)&lt;br /&gt;
* C.C. in1 &amp;lt;- 125 MHz osc&lt;br /&gt;
* C.C. in2 &amp;lt;- CLK_CC_IN &amp;lt;- FPGA AK9,AK8 &amp;lt;- SFP RX recovered clock, 125 MHz&lt;br /&gt;
* C.C. in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT0 -&amp;gt; MGTREFCLK0_B -&amp;gt; QSFP RX and TX ref clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT1 -&amp;gt; MGTREFCLK1_D -&amp;gt; SFP TX clock&lt;br /&gt;
* C.C. 125 MHz -&amp;gt; CLK_CC_OUT2 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; not used&lt;br /&gt;
* C.C. 62.5 MHz -&amp;gt; VX clock fanout&lt;br /&gt;
&lt;br /&gt;
Complete:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
125 MHz oscillator - U5 fan out -&lt;br /&gt;
  q0 -&amp;gt; CLK_XO_125 -&amp;gt; ENC C72,C74 -&amp;gt; FPGA R8,R7 MGTREFCLK0_A -&amp;gt; XDC CLK_XO_125_P -&amp;gt; VHDL not used&lt;br /&gt;
  q1 -&amp;gt; U6 C.C. in1&lt;br /&gt;
  q2 -&amp;gt; CLK3_XO_125 -&amp;gt; ENC C7,C9 -&amp;gt; FPGA J8,J7 MGTREFCLK1_B -&amp;gt; XDC GDM missing, CDM CLK3_XO_125_P -&amp;gt; VHDL SFP RX reference clock (mgt_rx_ref_clk)&lt;br /&gt;
  q3 -&amp;gt; not used, was CLK2_XO_125&lt;br /&gt;
&lt;br /&gt;
U6 C.C (clock cleaner) -&lt;br /&gt;
&lt;br /&gt;
in0 &amp;lt;- CLK_EXT1 (GPS 10 MHz clock)&lt;br /&gt;
in1 &amp;lt;- 125 MHz oscillator via U5&lt;br /&gt;
in2 &amp;lt;- CLK_CC_IN &amp;lt;- ENC C142,C144 &amp;lt;- FPGA AK9,AK8 &amp;lt;- XDC GDM missing, CDM CLK_CC_IN1_P &amp;lt;- VHDL rx_clk&lt;br /&gt;
in3 &amp;lt;- CLK_FB&lt;br /&gt;
&lt;br /&gt;
out0 -&amp;gt; CLK_CCA -&amp;gt; U12 (125 MHz)&lt;br /&gt;
out1 -&amp;gt; CLK_CCB -&amp;gt; VX1..6 (62.5 MHz)&lt;br /&gt;
out2 -&amp;gt; CLK_CCC -&amp;gt; VX7..12 (62.5 MHz)&lt;br /&gt;
out3 -&amp;gt; CLK_FB into in3&lt;br /&gt;
&lt;br /&gt;
CLK_CCA -&amp;gt; U12 (125 MHz fan out) -&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Q0 -&amp;gt; not used&lt;br /&gt;
Q1 -&amp;gt; CLK_CC_OUT0 -&amp;gt; ENC C3,C5 -&amp;gt; FPGA L8,L7 MGTREFCLK0_B -&amp;gt; XDC GDM clk_mgtrefclk0_x0y1_p, CDM CLK_CC_OUT0_P -&amp;gt; VHDL  GDM mgt_b_ref_clk QSFP RX and TX reference clocks, CDM alternate rx_clk via clock mux&lt;br /&gt;
Q2 -&amp;gt; CLK_CC_OUT1 -&amp;gt; ENC B3,B5 -&amp;gt; FPGA B10,B9 MGTREFCLK1_D -&amp;gt; XDC CLK_CC_OUT1_P -&amp;gt; VHDL GDM not used, CDM mgt_tx_ref_clk SFP TX clock&lt;br /&gt;
Q3 -&amp;gt; CLK_CC_OUT2 -&amp;gt; ENC C151,C153 -&amp;gt; FPGA AG8,AH8 (GC) -&amp;gt; XDC GDM, CDM missing&lt;br /&gt;
Q4 -&amp;gt; not used&lt;br /&gt;
Q5 -&amp;gt; SMA J9/J10&lt;br /&gt;
&lt;br /&gt;
CLK_TP0 &amp;lt;-&amp;gt; ENC C69,C71 &amp;lt;-&amp;gt; FPGA N8,N7 MGTREFCLK1_A (not used) -&amp;gt; XDC CLK_TP0_P -&amp;gt; VHDL not used (DS-DM SMA J11, J12)&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* Enclustra ENC-B is J801, ENC-C is J900&lt;br /&gt;
* &amp;quot;(GC)&amp;quot; is clock-capable FPGA pin&lt;br /&gt;
* CLK_XO_125 (125 MHz osc) is not used in FPGA&lt;br /&gt;
* 62.5 MHz VX clock does not go into the FPGA&lt;br /&gt;
* CLK_EXT0 going to in1 of U5 cannot be used. only permitted frequency is 125 MHz (it drives the MGT reference clocks) and is this frequency is too high for LEMO cables and connectors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= I2C bus =&lt;br /&gt;
&lt;br /&gt;
* I2C_SCL is J-ENC-A pin 111 I2C_SCL is FPGA I2C_SCL_PL AB13 (IO_L1N_TOL1D_64) and I2C_SCL_PS F18 (PS_MIO10)&lt;br /&gt;
* I2C_SDA is J-ENC-A pin 113 I2C_SDA is FPGA I2C_SDA_PL AH13 (IO_L7N_T1L1Q_AD13N_64) and I2C_SDA_PS G18 (PS_MIO11)&lt;br /&gt;
&lt;br /&gt;
* XU8 secure EEPROM ATSHA204A at 0x64, this is 0110&#039;010X -&amp;gt; linux _011&#039;0010 is 0x32. (but responds to scan and read at 0x33)&lt;br /&gt;
* U4 ethernet mac chip, EEPROM at 1010 A2 A1 A0 X and MAC/serial_no at 1011 A2 A1 A0 X. A0=VCC, A1=VCC, A2=GND -&amp;gt; linux _101&#039;0011 and _101&#039;1011 is 0x53 and 0x5B.&lt;br /&gt;
* U6 clock chip, address 1101 0 A1 A0 X. A1=VCC, A0=N/C (internal pull-up) -&amp;gt; linux _110&#039;1011 is 0x6b&lt;br /&gt;
* U23 voltmeter at 10011 ADR1 ADR0. ADR0=GND, ADR1=VCC -&amp;gt; linux _100&#039;1110 is 0x4e&lt;br /&gt;
* SFP, address 1010000X -&amp;gt; linux _101&#039;0000 is 0x50. additional SFP data at 0x51&lt;br /&gt;
* QSFP0, QSFP1, QSFP2, QSFP3 (QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL)&lt;br /&gt;
&lt;br /&gt;
= I2C clock builder connection =&lt;br /&gt;
&lt;br /&gt;
* use Silicon Labs USB &amp;quot;Clock builder pro field programmer&amp;quot;, www.silabs.com/CBProgrammer&lt;br /&gt;
* connect rainbow jumper cable pins:&lt;br /&gt;
** black - 1-GND to GND on DS-DM&lt;br /&gt;
** white - 3-SCLK to SCL on the DS-DM&lt;br /&gt;
** grey - 7-SDA_SDIO to SDA on the DS-DM&lt;br /&gt;
* power up the DS-DM&lt;br /&gt;
* plug USB programmer into Windows laptop&lt;br /&gt;
* on Windows, run &amp;quot;ClockBuilder Pro&amp;quot;&lt;br /&gt;
* it should report &amp;quot;Field programmer detected&amp;quot;, press &amp;quot;EVB GUI&amp;quot;&lt;br /&gt;
* in EVB GUI, press &amp;quot;Config&amp;quot;, set I2C address 0x6B&lt;br /&gt;
* press &amp;quot;Scan&amp;quot;, it should find Si5394A-A-GM&lt;br /&gt;
* select the &amp;quot;Status&amp;quot; tab, should see real-time status of clock chip&lt;br /&gt;
&lt;br /&gt;
= GDM MGT configuration =&lt;br /&gt;
&lt;br /&gt;
* TX configuration:&lt;br /&gt;
* GDM MGT transceivers are configured as &amp;quot;multilane&amp;quot; TX and RX.&lt;br /&gt;
* there is 12 TXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* MGT reference 125 MHz clock goes into [2:0]gtreclk00_in and [11:0]gtrefclk0_in&lt;br /&gt;
* one MGT is designated as &amp;quot;master&amp;quot;&lt;br /&gt;
* PLL of master MGT converts reference clock into common TX clock and common tx_user_clk2 which becomes tx_data_clk&lt;br /&gt;
* common tx_user_clk2 aka tx_data_clk goes into all TXes and clocks tx_data.&lt;br /&gt;
* tx_user_clk2 aka tx_data_clk is 125 MHz but not same phase as MGT reference clock.&lt;br /&gt;
&lt;br /&gt;
* RX interim configuration:&lt;br /&gt;
* there is 12 RXes (&amp;quot;lanes&amp;quot;)&lt;br /&gt;
* each RX produces it&#039;s own recovered RX clock&lt;br /&gt;
* &amp;quot;multilane&amp;quot; configuration assumes all RX recovered clocks run at the same frequency (TX on the other end are driven by common TX clock, see above), but have different phase&lt;br /&gt;
* one RX recovered clock is designated as &amp;quot;master&amp;quot; (rx_user_clk2 aka rx_data_clk) and a phase-matching fifo/buffer is used to bring rx_data from all 12 RXes to this common rx_data_clk&lt;br /&gt;
* this works because each CDM SFP TX runs on the SFP RX recovered clock which is frequency-locked with the GDM QSFP TX clock.&lt;br /&gt;
&lt;br /&gt;
* RX final configuration:&lt;br /&gt;
* MGTs permit using the common TX clock (tx_user_clk2 aka tx_data_clk) as the common rx_data_clk (they are frequency locked through the CDM).&lt;br /&gt;
* this permits use of tx_data_clk as the main clock domain in the GDM and removes the need to bring rx_data into the tx_data_clk domain (actually this is done in the MGT RX phase matching fifo/buffer).&lt;br /&gt;
&lt;br /&gt;
= Clock path =&lt;br /&gt;
&lt;br /&gt;
NOTE: MUST REVIEW!!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
10 MHz ext clock or GDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; GDM QSFP MGT reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz (GDM main clock domain) and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; GDM QSFP optic transmitter&lt;br /&gt;
-&amp;gt; CDM SFP optic receiver&lt;br /&gt;
-&amp;gt; CDM SFP MGT, RX reference clock is CDM 125 MHz oscillator&lt;br /&gt;
-&amp;gt; MGT RX recovered clock 125 MHz (CDM main clock domain)&lt;br /&gt;
-&amp;gt; CC_CLK_IN -&amp;gt; CDM C.C. -&amp;gt; CC_CLK_OUT1 -&amp;gt; CDM SFP TX reference clock 125 MHz&lt;br /&gt;
-&amp;gt; MGT PLL -&amp;gt; tx_data_clk 125 MHz and TX bit clock 2.5 GHz&lt;br /&gt;
-&amp;gt; (tx_data phase matching fifo from CDM main clock domain to tx_data_clk)&lt;br /&gt;
-&amp;gt; CDM SFP optic transmitter&lt;br /&gt;
-&amp;gt; GDM QSFP RX optic receiver (12x)&lt;br /&gt;
-&amp;gt; GDM QSFP MGT (RX reference clock is same as TX reference clock)&lt;br /&gt;
-&amp;gt; MGT RX recovered clock (12x recovered clocks)&lt;br /&gt;
-&amp;gt; in multi-lane configuration, one of them is the &amp;quot;master&amp;quot; recovered clock rx_data_clk&lt;br /&gt;
-&amp;gt; (rx_data phase matching fifo from rx_data_clk to GDM main clock domain)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= CDM rx_clk mux =&lt;br /&gt;
&lt;br /&gt;
when CDM SFP is not connected, there is no SFP recovered clock and a mux is used to switch between clk_cc_out0 (power up default) and rx_clk_mgt (SFP recovered clock)&lt;br /&gt;
&lt;br /&gt;
== Test SFP disconnected ==&lt;br /&gt;
&lt;br /&gt;
note: if I say &amp;quot;--cc-in1&amp;quot;, CC seems to lock on the 10 MHz GPS external clock,&lt;br /&gt;
to prevent this, test sequence includes reloading the CC and the reset of MGT.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x0 ### rx_clk mux select CC clock&lt;br /&gt;
./test_cdm_local.exe --load-cc&lt;br /&gt;
./test_cdm_local.exe --reset-mgt&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773594e (125000014) should be ~125 MHz  &amp;lt;=== all 4 clocks wobble close to 125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773594f (125000015) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
./test_cdm_local.exe --write32 0x30 0x1 ### rx_clk mux select SFP recovered clock&lt;br /&gt;
./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x076d58ec (124606700) should be ~125 MHz  &amp;lt;=== off frequency because there is no valid SFP recovered clock&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0773598c (125000076) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x0773598b (125000075) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Clock domains =&lt;br /&gt;
&lt;br /&gt;
== GPS ==&lt;br /&gt;
&lt;br /&gt;
* no GPS : GDM runs from internal 125 MHz oscillator&lt;br /&gt;
* external 10 MHz clock : GDM runs from external 10 MHz clock and optional 1pps signal (use VME-NIMIO32 NIM outputs)&lt;br /&gt;
* GPS receiver : GDM runs from GPS 10 MHz clock and GPS IRIG serial data&lt;br /&gt;
* LNGS GPS:&lt;br /&gt;
** provides 1pps and serial data over fiber from GPS receiver (master). LNGS xxx box is not used.&lt;br /&gt;
** serial data goes to GDM, decoded, 1pps signal extracted, goes to LEMO output&lt;br /&gt;
** 1pps from GDM is used to train the Rubidium clock which provides a 10 MHz clock&lt;br /&gt;
** 10 MHz output from Rubidium clock goes to GDM 10 MHz external clock input&lt;br /&gt;
&lt;br /&gt;
== GDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 125 MHz oscillator - to clock cleaner&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner&lt;br /&gt;
* FPGA 125 MHz clock CLK_CC_IN - to clock cleaner - not used (could be used for cascaded GDMs)&lt;br /&gt;
* 125 MHz oscillator - CLK3_XO_125 - mgt_b_ref_clk QSFP MGT reference clock (interim GDM design)&lt;br /&gt;
* clock cleaner output 125 MHz fanout:&lt;br /&gt;
** CLK_CC_OUT0 - QSFP MGT reference clock (final design)&lt;br /&gt;
** CLK_CC_OUT1 - not used (CDM SFP reference clock)&lt;br /&gt;
** CLK_CC_OUT2 - not used&lt;br /&gt;
* QSFP MGT TX data clock 125 MHz tx_data_clk (main clock domain)&lt;br /&gt;
** QSFP TX data&lt;br /&gt;
** QSFP RX data (in final design, rx_data_clk is same as tx_data_clk. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk == tx_data_clk)&lt;br /&gt;
** ds20k block&lt;br /&gt;
* (in interim design, rx_data_clk is disconnected from tx_data_clk. rx_data_clk is the &amp;quot;multilane master clock&amp;quot; which is one of the 12x RX recovered clocks. inside the MGT, 12x phase matching fifos for RX data from 12x RX recovered clocks to rx_data_clk)&lt;br /&gt;
&lt;br /&gt;
note: all these clocks are frequency locked to 125 MHz&lt;br /&gt;
&lt;br /&gt;
== CDM ==&lt;br /&gt;
&lt;br /&gt;
* AXI clock (100 MHz) - AXI registers&lt;br /&gt;
* 10 MHz external clock LEMO input - to clock cleaner (not used)&lt;br /&gt;
* 125 MHz oscillator to fanout&lt;br /&gt;
** to clock cleaner&lt;br /&gt;
** to SFP MGT RX reference clock: CLK3_XO_125 to mgt_rx_ref_clk to gtrefclk01_in&lt;br /&gt;
* SFP MGT RX recovered clock 125 MHz&lt;br /&gt;
** MGT PLL to MGT rx_user_clk2 aka rx_data_clk&lt;br /&gt;
** MGT rxrecclkout_out to mgt_rx_rec_clk to CLK_CC_IN to C.C.&lt;br /&gt;
* SFP MGT rx_user_clk2 aka rx_data_clk (250 MHz/8 bit, 125 MHz/16 bit, 62.5 MHz/32 bit data) (main clock domain)&lt;br /&gt;
** SFP RX data&lt;br /&gt;
** ds20k block&lt;br /&gt;
** VX TX clock PLLs&lt;br /&gt;
** VX RX clock PLLs&lt;br /&gt;
* C.C. fan out&lt;br /&gt;
** 62.5 MHz VX clocks (12x)&lt;br /&gt;
** CLK_CC_OUT0 (not used, GDM QSFP MGT reference clock)&lt;br /&gt;
** CLK_CC_OUT1 125 MHz to mgt_tx_ref_clk to gtrefclk00_in to SFP MGT TX reference clock&lt;br /&gt;
** CLK_CC_OUT2 (not used)&lt;br /&gt;
* SFP MGT tx_user_clk2 aka tx_data_clk&lt;br /&gt;
** SFP TX data&lt;br /&gt;
** TX data phase matching fifo from main clock domain to tx_data_clk&lt;br /&gt;
* VX TX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX TX data phase matching from main clock domain to VX TX clock (12 total)&lt;br /&gt;
** VX TX serializer&lt;br /&gt;
** VX TX LVDS transmitter&lt;br /&gt;
* VX RX clock PLLs&lt;br /&gt;
** 2 PLLs, 6 clocks each (12 total). phase of each clock independently adjusted via AXI registers&lt;br /&gt;
** VX RX LVDS receivers (12 total)&lt;br /&gt;
** VX RX deserializers (12 total)&lt;br /&gt;
** VX TX data phase matching from VX RX clock to main clock domain&lt;br /&gt;
&lt;br /&gt;
== VX ==&lt;br /&gt;
&lt;br /&gt;
* everything runs on the VX main 125 MHz clock&lt;br /&gt;
* correct phase of VX to CDM LVDS data is adjusted by scan of CDM VX RX PLL clock phase (VX to CDM link is now established)&lt;br /&gt;
* correct phase of CDM to VX LVDS data is adjusted by scan of CDM VX RX PLL clock phase (link is established after VX to CDM idle data pattern changes from &amp;quot;VX RX data bad&amp;quot; to &amp;quot;good&amp;quot;.&lt;br /&gt;
* after good phases are found by scan, they are not expected to change unless cables are changed, CDM and VX modules are changed or CDM firmware is rebuilt. (rebuild of VX firmware should not affect LVDS data phase).&lt;br /&gt;
* if there is excessive link errors, phase scan must be repeated.&lt;br /&gt;
&lt;br /&gt;
= Board test plan =&lt;br /&gt;
&lt;br /&gt;
To test:&lt;br /&gt;
* Enclustra FPGA board&lt;br /&gt;
* SFP port - SFP_RS0/RS1 connected to QSFP0_SEL/1_SEL is wrong? our Finisar SFP says RS0, RS1 N/C, so probably okey.&lt;br /&gt;
* SW5 CLK_EXT1 NIM works. TTL needs to be tested. flipping SW5 CLK_EXT0 side from NIM to TTL makes CLK_EXT1 go LOS and OOF in the clock chip. R23 and R53 should be removed?&lt;br /&gt;
* BOOT_MODE 0 and 1&lt;br /&gt;
&lt;br /&gt;
Partial:&lt;br /&gt;
* U23 3.3V current meter and thermometer. V1,V2 is current monitor, same as in application note. V3,V4 is thermometer, same in application note, except capacitor C118 is 0.1u instead of 470pF. Tested ok: Tint, VCC, V1, V2, V1-V2. Test failed: TR2 reads 50-something degC instead of same as Tint.&lt;br /&gt;
&lt;br /&gt;
Done:&lt;br /&gt;
* LED_FP1A..D: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* USB UART: tested ok. K.O. 15 sep 2022&lt;br /&gt;
* J4A, J4B, J5A, J5B LEMO inputs (NIM/TTL) EXT_IN_LV(1..4). TTL threshold 1.7V, NIM threshold -0.3V. 50 Ohm termination. TTL straight, NIM inverted.&lt;br /&gt;
* J6A, J6B LEMO clock inputs: 10 MHz TTL from chronobox works, 10 MHz NIM from IO32 works. 18-apr-2023&lt;br /&gt;
* J7A, J7B LEMO outputs EXT_OUT(1), EXT_OUT(2) (NIM/TTL) (tested 23nov2022, K.O.). TTL ???, NIM inverted.&lt;br /&gt;
** TTL out no 50 ohm termination: 0=0V, 1=5V, rise and fall time ~5 ns&lt;br /&gt;
** TTL out with 50 ohm termination: 0=0V, 1=2.5V, rise and fall time &amp;lt;2ns&lt;br /&gt;
** NIM out no 50 ohm termination: 0=+50mV, 1=-1.8V, rise and fall time ~3ns&lt;br /&gt;
** NIM out with 50 ohm termination: 0=0V, 1=-0.9V, rise and fall time &amp;lt;2ns&lt;br /&gt;
* ethernet MAC i2c chip (K.O. 20sep2022: can read: i2cdump 0 0x5b, nov2022 have u-boot driver)&lt;br /&gt;
* CDM VX ports 2x(CLK, 3 tx, 4 rx) tested using test_cdm.exe and LVDS loopback in VX firmware.&lt;br /&gt;
* SFP i2c tested KO 22jun2023&lt;br /&gt;
* QSFP i2c tested KO 22jun2023&lt;br /&gt;
* i2c testing complete 22jun2023&lt;br /&gt;
* QSFP rx,tx tested 26june2023. lane0,1,2 ok, lane3 tx not connected, laser is off. qsfp0,1,2,3 all lanes ok.&lt;br /&gt;
* SFP rx,tx tested 26june2023. rx and tx okey. LOS ok, mod_absent ok.&lt;br /&gt;
&lt;br /&gt;
Failure:&lt;br /&gt;
* ethernet: does not connect to alliedtelesys switch. connects to my USB-eth adapter at 100 Mbit speed. uboot mii status reports connection speed oscillating between 1000, 100 and 10. K.O. 16-sep-2022&lt;br /&gt;
* SFP LOS and mod_absent are swapped (in the FPGA pin definitions?)&lt;br /&gt;
* QSFP slot numbering is wrong.&lt;br /&gt;
&lt;br /&gt;
= Checklist for newly build boards =&lt;br /&gt;
&lt;br /&gt;
== setup and boot ==&lt;br /&gt;
* put new board on workbench&lt;br /&gt;
* check - vme connector present, vme extraction handles present&lt;br /&gt;
* check - standoff are removed from all thru-holes&lt;br /&gt;
* plug Enclustra module&lt;br /&gt;
* check - SW1 both switches are in the &amp;quot;6&amp;quot; and &amp;quot;3&amp;quot; positions&lt;br /&gt;
* check - SW6 both switches are in the &amp;quot;PS&amp;quot; position&lt;br /&gt;
* Rev0: connect micro-usb cable from linux PC&lt;br /&gt;
* Rev1: connect usb-C cable from linux PC (USB C-to-C or C-to-A)&lt;br /&gt;
* connect ethernet from 1gige capable network switch&lt;br /&gt;
* connect power from lab power supply - GND, +5V and -12V nominal, +5.7V and -12.5V actual&lt;br /&gt;
* power up, +5V current 2.10-2.8A, -12V current 0.05A&lt;br /&gt;
* on linux PC, open a new terminal, run: minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* in minicom window, observe messages about Xilinx first stage boot loader, etc&lt;br /&gt;
* on the ethernet switch, observe network link is 1gige speed (not 10mbit, not 100mbit).&lt;br /&gt;
* if everything boots okey, there will be a login prompt, login as root, password root.&lt;br /&gt;
* alternatively, from root@daq13: ssh root@dsdm&lt;br /&gt;
* busybox devmem 0x80010000 # read firmware version number, i.e. 0xEDAD0A77&lt;br /&gt;
== test i2c ==&lt;br /&gt;
* check i2c: (no SFP, no QSFP plugged in!)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test clock chip:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --load-cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Loading CC registers...&lt;br /&gt;
Clock chip data block size 519&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 IN1 IN_SEL_1&lt;br /&gt;
Ctrl-C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test RTC:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 0 1 0 0 1 1 0  0x26&lt;br /&gt;
reg 0x01:  0 0 1 1 1 0 0 1  0x39&lt;br /&gt;
reg 0x02:  0 0 0 0 0 1 1 1  0x07&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 1 0  0x02&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 1  0x01&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  0 1 0 0 0 0 0 0  0x40&lt;br /&gt;
seconds: 26, minutes: 39, hours: 07, day 2, date: 00-01-02, temp 23.25C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test clocks ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
...&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735cb9 (125000889) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735c69 (125000809) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735c6a (125000810) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test LED, LEMO ==&lt;br /&gt;
&lt;br /&gt;
* test LEDs, observe all 4 LEDs turn on and off every 1 second&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --blink-led&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
LED on&lt;br /&gt;
LED off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO outputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
have test firmware lemo outputs are RTC chip 1pps and 48kHz&lt;br /&gt;
see them on the scope&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* TBW - test LEMO inputs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./test_cdm_local.exe --monreg 6&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test VX ==&lt;br /&gt;
&lt;br /&gt;
* on the CDM, connect all split blue cables to VX modules&lt;br /&gt;
* set all VX modules to LVDS loopback mode (in VX settings MIDAS page)&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --test-vx&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000eeeeeeeeeeee 0x00007700: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000080808080808 0x00000100: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000040404040404 0x00000200: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000020202020202 0x00000400: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00000800: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000808080808080 0x00001000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000404040404040 0x00002000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000202020202020 0x00004000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
CDM registers: 0x0000000000000000 0x00008000: port0 ok port1 ok port2 ok port3 ok port4 ok port5 ok &lt;br /&gt;
all on!&lt;br /&gt;
all off!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on the VX settings MIDAS page LVDS input section, observe line status is cycling on and off.&lt;br /&gt;
* note: VX_RX(0) is not tested by this, corresponding VX_TX is used as the VX clock&lt;br /&gt;
&lt;br /&gt;
== test SFP (CDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect SFP module&lt;br /&gt;
* ssh root@cdm00&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --sfp&amp;quot;, it should report:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm00:~# ./test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x6a332b58, ds20k version 0x20241209&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB4LV         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 30.9 C&lt;br /&gt;
vcc  3.285 V&lt;br /&gt;
tx_bias  7.362 mA&lt;br /&gt;
tx_power 475.7 uW&lt;br /&gt;
rx_power 859.1 uW&lt;br /&gt;
SFP good 1, status: temp 30.9 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.7 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 859 uW&lt;br /&gt;
SFP good 1, status: temp 30.8 C, tx_bias 7.4 mA, tx_power 475 uW, rx_power 858 uW&lt;br /&gt;
^C&lt;br /&gt;
root@cdm00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: if fiber cable is disconnected or GDM is not running, rx_power would read 0 uW&lt;br /&gt;
* NOTE2: better SFP modules have smaller tx_bias and larger tx_power (more bang for the buck)&lt;br /&gt;
* NOTE3: bad fiber cable and bad fiber connection will result in smaller rx_power&lt;br /&gt;
&lt;br /&gt;
== test QSFP (GDM) ==&lt;br /&gt;
&lt;br /&gt;
* connect QSFP module (any slot)&lt;br /&gt;
* ssh root@gdm01&lt;br /&gt;
* run &amp;quot;./test_cdm.exe --qsfp3 --qsfp&amp;quot;, try --qsfp0, --qsfp1, --qsfp2, --qsfp3 for the 4 QSFP slots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm01:~# ./test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
DS-DM firmware build 0x9e30baf9, ds20k version 0x20241209&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x89&lt;br /&gt;
temp       36.7 C&lt;br /&gt;
vcc        3.302 V&lt;br /&gt;
rx_power     0.1 413.7 460.3   0.1 uW&lt;br /&gt;
tx_bias      7.8   7.9   7.9   0.0 mA&lt;br /&gt;
tx_power   806.0 842.9 865.2   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 36.7 C, los 0x89, tx_bias 7.8 7.9 7.9 0.0 mA, tx_power 806 843 865   0 uW, rx_power   0 414 460   0 uW&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* NOTE1: 4th tx_bias and tx_power are zero because 4th channel does not transmit any data, QSFP detects this and automatically shuts down the optical transmitter&lt;br /&gt;
&lt;br /&gt;
= Serial console =&lt;br /&gt;
&lt;br /&gt;
* check that linux computer has correct udev rules to allow access to /dev/ttyACM devices, see https://daq00.triumf.ca/DaqWiki/index.php/SLinstall#Configure_USB_device_permissions and https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Configure_USB_device_permissions&lt;br /&gt;
* connect micro-USB cable to connector J-UCB, other end connect to linux computer&lt;br /&gt;
* observe /dev/ttyACM0 was created&lt;br /&gt;
* run &amp;quot;minicom -D /dev/ttyACM0 -b 115200&amp;quot;&lt;br /&gt;
* should have gdm-cdm login&lt;br /&gt;
* username root, password root&lt;br /&gt;
&lt;br /&gt;
= i2c =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; i2c bus&lt;br /&gt;
Bus 0:  i2c@ff020000&lt;br /&gt;
ZynqMP&amp;gt; i2c dev 0&lt;br /&gt;
Setting bus to 0&lt;br /&gt;
ZynqMP&amp;gt; i2c probe  &lt;br /&gt;
Valid chip addresses: 33 4E 53 5B 6B 77&lt;br /&gt;
ZynqMP&amp;gt; i2c md 0x5b 0x98&lt;br /&gt;
0098: fc c2 3d 00 00 12 1a 6e 0a 90 85 04 94 10 08 50    ..=....n.......P&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm-cdm:~# i2cdetect 0&lt;br /&gt;
Warning: Can&#039;t use SMBus Quick Write command, will skip some addresses&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0.&lt;br /&gt;
I will probe address range 0x03-0x77.&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                                                 &lt;br /&gt;
10:                                                 &lt;br /&gt;
20:                                                 &lt;br /&gt;
30: -- -- -- 33 -- -- -- --                         &lt;br /&gt;
40:                                                 &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60:                                                 &lt;br /&gt;
70:                                                 &lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
root@gdm-cdm:~# i2cdump 0 0x5b&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
WARNING! This program can confuse your I2C bus, cause data loss and worse!&lt;br /&gt;
I will probe file /dev/i2c-0, address 0x5b, mode byte&lt;br /&gt;
Continue? [Y/n] &lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 50 90 5b a0 00 a0 00 00 00    ???????P?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 6e    ........??=..??n&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@gdm-cdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdetect -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 51 -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 0x33 - XU8 secure EEPROM (should be at 0x32)&lt;br /&gt;
* 0x4e - U23 current and temperature monitor&lt;br /&gt;
* 0x50, 0x51 - SFP&lt;br /&gt;
* 0x50 - QSFP, 4 QSFP modules enabled by GPIO QSFP0_SEL, QSFP1_SEL, QSFP2_SEL, QSFP3_SEL&lt;br /&gt;
* 0x53, 0x5b - ethernet mac eeprom&lt;br /&gt;
* 0x6b - U6 clock chip&lt;br /&gt;
&lt;br /&gt;
== U23 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: Text reads double of Tint. not sure why. K.O. 21-mar-2024.&lt;br /&gt;
&lt;br /&gt;
* internal temperature only&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x00 b  # control register: &amp;quot;repeat mode, internal temperature only&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x03 # &amp;quot;Tint ready&amp;quot; and &amp;quot;busy&amp;quot;, &amp;quot;busy is always 1 in repeat mode&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 00 03 03 81 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
10: 01 00 01 01 01 db 2a ce 2a 8e 00 6f 00 45 20 3f    ?.????*?*?.o.E ?&lt;br /&gt;
...&lt;br /&gt;
readback:&lt;br /&gt;
reg0 - 03 - Tint ready&lt;br /&gt;
reg1 - 00 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB 0x81, bit 0x80 is &amp;quot;DV, data valid&amp;quot;, bit 0x40 is &amp;quot;SS, sensor short&amp;quot;, 0x20 is &amp;quot;SO, sensor open&amp;quot;&lt;br /&gt;
reg5 - Tint LSB 0xDB, Tint = 0x01DB = 475 * 0.0625 degC = 29.6 degC&lt;br /&gt;
reg6..F - stale data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1, V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x18 b  # control register: &amp;quot;repeat mode, V1, V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 18 7f 7f 81 b9 aa d0 aa 8f 83 5e 83 5e a0 41    ???????????^?^?A&lt;br /&gt;
10: 01 18 01 01 01 b9 2a d0 2a 8f 03 5e 03 5e 20 41    ??????*?*??^?^ A&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x1b9*0.0625 = 27.5 degC&lt;br /&gt;
reg6 - V1 MSB 0xaa, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 LSB 0xd0, V1 = 0x2ad0*305.18/1000000 = 3.3447 V (correct)&lt;br /&gt;
reg8 - V2 MSB 0xaa, ditto&lt;br /&gt;
reg9 - V2 LSB 0x8f, V2 = 0x2a8f*305.18/1000000 = 3.3249 V (correct, smaller than V1)&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x5e. TR2 = 0x35e*0.0625 = 53.875 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x41, VCC = 2.5+0x2041*305.18/1000000 = 5.019 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.99 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Tint, V1-V2, TR2, VCC&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x01 0x19 b  # control register: &amp;quot;repeat mode, V1-V2, TR2&amp;quot;&lt;br /&gt;
root@gdm0:~# i2cset -y 0 0x4e 0x02 0xff b # trigger&lt;br /&gt;
root@gdm0:~# i2cget -y 0 0x4e 0x00 b # status register&lt;br /&gt;
0x7f # all data is ready&lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x4e b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 7f 19 7f 7f 81 69 83 f2 83 f2 83 3a 83 3a a0 44    ?????i?????:?:?D&lt;br /&gt;
10: 01 19 01 01 01 69 03 f2 03 f2 03 3a 03 3a 20 44    ?????i?????:?: D&lt;br /&gt;
reg0 - 7F - all data ready&lt;br /&gt;
reg1 - 18 - what we put there&lt;br /&gt;
reg2 - trigger&lt;br /&gt;
reg3 - not used&lt;br /&gt;
reg4 - Tint MSB and DV, SS, SO.&lt;br /&gt;
reg5 - Tint LSB 0x169*0.0625 = 22.5 degC&lt;br /&gt;
reg6 - V1 or V1-V2 MSB 0x83, bit 0x80 is DV, bit 0x40 is sign&lt;br /&gt;
reg7 - V1 or V1-V2 LSB 0xf2, V1-V2 = 0x3f2*19.42/1000000 = 0.0196142 V (correct, compare with V1 and V2 measured above)&lt;br /&gt;
reg8 - V2 or V1-V2 MSB&lt;br /&gt;
reg9 - V2 or V1-V2 LSB&lt;br /&gt;
regA - V3 MSB or TR2 MSB 0x83, 0x80=DV, 0x40=SS, 0x20=SO&lt;br /&gt;
regB - V3 LSB or TR2 LSB 0x3a. TR2 = 0x33a*0.0625 = 51.625 degC (wrong, thermistor Q5 is next to U23, should read same as Tint)&lt;br /&gt;
regC - V4 MSB or TR2 MSB&lt;br /&gt;
regD - V4 LSB or TR2 LSB&lt;br /&gt;
regE - VCC MSB 0xa0, bit 0x80 is DV, 0x40 is sign&lt;br /&gt;
regF - VCC LSB 0x44, VCC = 2.5+0x2044*305.18/1000000 = 5.021 V (correct, VCC is +5V)&lt;br /&gt;
&lt;br /&gt;
3V3_SW current is (V2-V1)/0.020 = 0.9807 A (about right?)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x50&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 03 04 07 00 00 00 00 40 40 0c 00 01 3d 00 00 00    ???....@@?.?=...&lt;br /&gt;
10: 0c 02 00 1e 46 49 4e 49 53 41 52 20 43 4f 52 50    ??.?FINISAR CORP&lt;br /&gt;
20: 2e 20 20 20 00 00 90 65 46 54 4c 46 38 35 32 36    .   ..?eFTLF8526&lt;br /&gt;
30: 50 33 42 4e 4c 20 20 20 41 20 20 20 03 52 00 9d    P3BNL   A   ?R.?&lt;br /&gt;
40: 00 1a 00 00 4e 33 41 42 34 4c 56 20 20 20 20 20    .?..N3AB4LV     &lt;br /&gt;
50: 20 20 20 20 32 30 30 33 31 39 20 20 68 f0 03 de        200319  h???&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
root@cdm0:~# i2cdump 0 0x51&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 5a 00 d8 00 55 00 e2 00 90 88 71 48 8c a0 75 30    Z.?.U.?.??qH??u0&lt;br /&gt;
10: 21 34 01 f4 1b 58 03 e8 31 2d 04 eb 1f 07 06 31    !4???X??1-?????1&lt;br /&gt;
20: 31 2d 00 64 27 10 00 9e 00 00 00 00 00 00 00 00    1-.d&#039;?.?........&lt;br /&gt;
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
40: 00 00 00 00 3f 80 00 00 00 00 00 00 01 00 00 00    ....??......?...&lt;br /&gt;
50: 01 00 00 00 01 00 00 00 01 00 00 00 00 00 00 b7    ?...?...?......?&lt;br /&gt;
60: 19 9f 80 c5 0e 17 12 c4 1f 99 00 00 00 00 30 00    ??????????....0.&lt;br /&gt;
70: 00 00 00 00 00 00 00 00 ff ff ff ff ff ff ff 01    ...............?&lt;br /&gt;
80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
d0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
e0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== QSFP ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
QSFP i2c enable lines, active low:&lt;br /&gt;
&lt;br /&gt;
QSFP0_SEL - JENC-A 82 - PS-MIO40 - linux gpio 378&lt;br /&gt;
QSFP1_SEL - JENC-A 84 - PS-MIO41 - linux gpio 379&lt;br /&gt;
QSFP2_SEL - JENC-A 100 - PS-MIO44 - linux gpio 382&lt;br /&gt;
QSFP3_SEL - JENC-A 106 - PS-MIO43 - linux gpio 381 (notice 2 and 3 are out of order)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
# echo 378 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL0 338+40&lt;br /&gt;
# echo 379 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL1 338+41&lt;br /&gt;
# echo 381 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL3 338+43&lt;br /&gt;
# echo 382 &amp;gt;&amp;gt; /sys/class/gpio/export ### SEL2 338+44&lt;br /&gt;
# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) in  hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) in  hi &lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio381/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio382/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio378/direction&lt;br /&gt;
root@gdm0:~# echo out &amp;gt;&amp;gt; /sys/class/gpio/gpio379/direction&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out lo &lt;br /&gt;
root@gdm0:~#&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio381/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio382/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
echo 1 &amp;gt;&amp;gt; /sys/class/gpio/gpio379/value&lt;br /&gt;
cat /sys/kernel/debug/gpio&lt;br /&gt;
root@gdm0:~# cat /sys/kernel/debug/gpio&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: -- -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
NOTICE NOTHING AT ADDRESS 0x50&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ENABLE QSFP0, OBSERVE IT IS AT ADDRESS 0x50&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# echo 0 &amp;gt;&amp;gt; /sys/class/gpio/gpio378/value&lt;br /&gt;
root@gdm0:~# i2cdetect -y -r 0&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f&lt;br /&gt;
00:                         -- -- -- -- -- -- -- -- &lt;br /&gt;
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
30: -- -- -- 33 -- -- -- -- -- -- -- -- -- -- -- -- &lt;br /&gt;
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 4e -- &lt;br /&gt;
50: 50 -- -- 53 -- -- -- -- -- -- -- 5b -- -- -- -- &lt;br /&gt;
60: -- -- -- -- -- -- -- -- -- -- -- 6b -- -- -- -- &lt;br /&gt;
70: -- -- -- -- -- -- -- --                         &lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# i2cdump -y 0 0x50&lt;br /&gt;
No size specified (using byte-data access)&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: 0d 00 02 8e 00 00 01 00 00 05 55 00 05 00 00 00    ?.??..?..?U.?...&lt;br /&gt;
10: 00 00 00 00 00 00 1e b8 00 00 81 a0 00 00 00 00    ......??..??....&lt;br /&gt;
20: 00 00 12 12 00 01 00 01 00 01 0e e0 0f 20 0e e0    ..??.?.?.???? ??&lt;br /&gt;
30: 00 00 1f a0 1e 3b 1f 72 00 01 00 00 00 00 00 00    ..???;?r.?......&lt;br /&gt;
40: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
60: 00 00 00 00 00 00 00 00 00 00 1f 00 00 00 08 00    ..........?...?.&lt;br /&gt;
70: 00 00 00 00 00 00 00 ff ff ff ff ff ff ff ff 00    ................&lt;br /&gt;
80: 0d 00 0c 04 00 00 00 40 40 02 d5 05 67 00 00 96    ?.??...@@???g..?&lt;br /&gt;
90: 00 00 c8 00 46 49 4e 49 53 41 52 20 43 4f 52 50    ..?.FINISAR CORP&lt;br /&gt;
a0: 20 20 20 20 07 00 90 65 46 54 4c 34 31 30 51 44        ?.?eFTL410QD&lt;br /&gt;
b0: 34 43 20 20 20 20 20 20 41 20 42 68 07 d0 00 43    4C      A Bh??.C&lt;br /&gt;
c0: 00 07 0f de 58 37 39 41 43 30 52 20 20 20 20 20    .???X79AC0R     &lt;br /&gt;
d0: 20 20 20 20 32 32 30 33 30 39 20 20 3c 10 00 9e        220309  &amp;lt;?.?&lt;br /&gt;
e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                    &lt;br /&gt;
f0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00    ................&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ethernet mac eeprom ==&lt;br /&gt;
&lt;br /&gt;
* correct chip with 84-bit ethernet mac address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
a0: 0a 80 c2 04 34 10 08 32 a8 4b a0 00 a0 00 00 00    ????4??2?K?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 00 00 fc c2 3d 1a 51 3c    ..........??=?Q&amp;lt;&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm1:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* wrong &amp;quot;602&amp;quot; chip with 64-bit IPv6 address&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x53&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
10: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
20: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
30: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
90: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
a0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
b0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
c0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
d0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
e0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
f0: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
root@cdm0:~# i2cdump 0 0x5b&lt;br /&gt;
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef&lt;br /&gt;
00: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
10: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
20: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
30: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
40: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
50: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
60: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
70: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff    ................&lt;br /&gt;
80: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
90: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
a0: 0a 90 85 04 94 10 08 51 10 5b a0 00 a0 00 00 00    ???????Q?[?.?...&lt;br /&gt;
b0: 00 00 00 00 00 00 00 00 fc c2 3d 00 00 12 1a 2e    ........??=..??.&lt;br /&gt;
c0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
d0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
e0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
f0: XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX XX    XXXXXXXXXXXXXXXX&lt;br /&gt;
root@cdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c =&lt;br /&gt;
&lt;br /&gt;
(this code is copied from uboot command line i2c code)&lt;br /&gt;
&lt;br /&gt;
in uboot sources board/xilinx/common/board.c replace original function with this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// special code to read ethernet MAC address from the DS-DM-Rev0 board. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
int zynq_board_read_rom_ethaddr(unsigned char *ethaddr)&lt;br /&gt;
{&lt;br /&gt;
        struct udevice *bus;&lt;br /&gt;
	int ret;&lt;br /&gt;
        int busnum = 0;&lt;br /&gt;
&lt;br /&gt;
	ret = uclass_get_device_by_seq(UCLASS_I2C, busnum, &amp;amp;bus);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: No bus %d\n&amp;quot;, __func__, busnum);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int chip_addr = 0x5B;&lt;br /&gt;
&lt;br /&gt;
        struct udevice *dev;&lt;br /&gt;
&lt;br /&gt;
        ret = i2c_get_chip(bus, chip_addr, 1, &amp;amp;dev);&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d no chip 0x%02x\n&amp;quot;, __func__, busnum, chip_addr);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        int dev_addr = 0x98;&lt;br /&gt;
&lt;br /&gt;
        unsigned char data[8];&lt;br /&gt;
           &lt;br /&gt;
        ret = dm_i2c_read(dev, dev_addr, data, 8);&lt;br /&gt;
&lt;br /&gt;
	if (ret) {&lt;br /&gt;
           printf(&amp;quot;%s: Bus %d chip 0x%02x read error %d\n&amp;quot;, __func__, busnum, chip_addr, ret);&lt;br /&gt;
           return ret;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: Bus %d chip 0x%02x addr 0x%02x read: 0x %02x %02x %02x %02x %02x %02x %02x %02x\n&amp;quot;, __func__, busnum, chip_addr, dev_addr, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]);&lt;br /&gt;
&lt;br /&gt;
        // see Atmel-8807-SEEPROM-AT24MAC402-602-Datasheet.pdf&lt;br /&gt;
&lt;br /&gt;
        if (data[0] == 0) {&lt;br /&gt;
           // eiu-48 chip&lt;br /&gt;
           ethaddr[0] = data[2];&lt;br /&gt;
           ethaddr[1] = data[3];&lt;br /&gt;
           ethaddr[2] = data[4];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        } else {&lt;br /&gt;
           // eiu-64 chip&lt;br /&gt;
           ethaddr[0] = data[0];&lt;br /&gt;
           ethaddr[1] = data[1];&lt;br /&gt;
           ethaddr[2] = data[2];&lt;br /&gt;
           ethaddr[3] = data[5];&lt;br /&gt;
           ethaddr[4] = data[6];&lt;br /&gt;
           ethaddr[5] = data[7];&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;%s: ethaddr %02x:%02x:%02x:%02x:%02x:%02x\n&amp;quot;, __func__, ethaddr[0], ethaddr[1], ethaddr[2], ethaddr[3], ethaddr[4], ethaddr[5]);&lt;br /&gt;
&lt;br /&gt;
        return ret;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
also this should have worked if i2c_xxx() functions were enabled in uboot:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
i2c_set_bus_num(0);&lt;br /&gt;
i2c_probe(0x5b);&lt;br /&gt;
i2c_read(0x5b, 0x9a, ethaddr, 6);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (SHOULD WORK) =&lt;br /&gt;
&lt;br /&gt;
from: https://stackoverflow.com/questions/43637540/is-there-linux-or-u-boot-support-to-read-a-mac-address-from-a-chip-at-startup&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#ethernet related setup&lt;br /&gt;
setup_eth=run readmac buildmac&lt;br /&gt;
#read mac address from eeprom&lt;br /&gt;
readmac=i2c dev 0; i2c read 50 FA.1 6 $loadaddr&lt;br /&gt;
#build the ethaddr variable&lt;br /&gt;
#not very nice, but does the job&lt;br /&gt;
buildmac=\&lt;br /&gt;
e=&amp;quot; &amp;quot;; sep=&amp;quot; &amp;quot; \&lt;br /&gt;
for i in 0 1 2 3 4 5 ; do\&lt;br /&gt;
setexpr x $loadaddr + $i\&lt;br /&gt;
setexpr.b b *$x\&lt;br /&gt;
e=&amp;quot;$e$sep$b&amp;quot;\&lt;br /&gt;
sep=&amp;quot;:&amp;quot;\&lt;br /&gt;
done &amp;amp;&amp;amp;\&lt;br /&gt;
setenv ethaddr $e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= read ethernet mac address from i2c (DOES NOT WORK) =&lt;br /&gt;
&lt;br /&gt;
this method does not work: inside board/xilinx/common/board.c:int zynq_board_read_rom_ethaddr(unsigned char *ethaddr), uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, eeprom, &amp;amp;dev) returns ENODEV and read from i2c does not happen. K.O. Sep-2022&lt;br /&gt;
&lt;br /&gt;
Read:&lt;br /&gt;
* https://support.xilinx.com/s/question/0D52E00006hpKlsSAE/uboot-and-ethernet-mac-address-from-eeprom?language=en_US (last answer)&lt;br /&gt;
* https://github.com/Xilinx/u-boot-xlnx/blob/master/board/xilinx/common/board.c (zynq_board_read_rom_ethaddr())&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* 0x5B is the i2c chip address&lt;br /&gt;
* 0x9A is the data offset inside the chip, see datasheet or i2c read dump above.&lt;br /&gt;
&lt;br /&gt;
Edit:&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/u-boot/files/platform-top.h&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/xilinx_zynqmp.h&amp;gt;&lt;br /&gt;
#include &amp;lt;configs/platform-auto.h&amp;gt;&lt;br /&gt;
//#define CONFIG_I2C_EEPROM                                                                                                                                                                   &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR 0x5b                                                                                                                                                     &lt;br /&gt;
//#define CONFIG_SYS_I2C_EEPROM_ADDR_OVERFLOW 0x0                                                                                                                                             &lt;br /&gt;
#define CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET 0x9A&lt;br /&gt;
#error HERE!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw PetaLinux_GDM_CDM/project-spec/meta-user/recipes-bsp/device-tree/files/system-user.dtsi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/include/ &amp;quot;system-conf.dtsi&amp;quot;&lt;br /&gt;
/ {&lt;br /&gt;
chosen {&lt;br /&gt;
   xlnx,eeprom = &amp;amp;eeprom;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&amp;amp;i2c0 {&lt;br /&gt;
eeprom: eeprom@5b { /* u88 */&lt;br /&gt;
compatible = &amp;quot;atmel,24mac402&amp;quot;;&lt;br /&gt;
reg = &amp;lt;0x5b&amp;gt;;&lt;br /&gt;
};&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* components/yocto/workspace/sources/u-boot-xlnx/configs/xilinx_zynqmp_virt_defconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CONFIG_ZYNQ_GEM_I2C_MAC_OFFSET=0x9A&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= RTC chip =&lt;br /&gt;
&lt;br /&gt;
* DS3231 RTC chip&lt;br /&gt;
* FPGA connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
I2C SCL &amp;lt;-  J-ENC A85 &amp;lt;-  FPGA E17 &amp;lt;-  XDC TP_S &amp;lt;-  VHDL RTC_I2C_SCL output (10k pull-up to 3.3V)&lt;br /&gt;
I2C SDA &amp;lt;-&amp;gt; J-ENC A87 &amp;lt;-&amp;gt; FPGA D17 &amp;lt;-&amp;gt; XDC TP_S &amp;lt;-&amp;gt; VHDL RTC_I2C_SDA bidir (10k pull-up to 3.3V)&lt;br /&gt;
RTC_1Hz  -&amp;gt; J-ENC C160 -&amp;gt; FPGA AH12 -&amp;gt; XDC &amp;quot;slow_io&amp;quot;  -&amp;gt; VHDL RTC_1PPS input (10k pull-up to 1.2V)&lt;br /&gt;
RTC_32k  -&amp;gt; J-ENC B129 -&amp;gt; FPGA AE3  -&amp;gt; XDC &amp;quot;free pin&amp;quot; -&amp;gt; VHDL RTC_32KHZ input (10k pull-up to 1.8V)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test notes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FPGA registers:&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&lt;br /&gt;
  ext_out(1) &amp;lt;= rtc_1pps_in;&lt;br /&gt;
  ext_out(2) &amp;lt;= rtc_32khz_in;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
After power us on the RTC chip:&lt;br /&gt;
  i2c clock 3.3V&lt;br /&gt;
  i2c data  3.3V&lt;br /&gt;
  32kHz     0.778V see clock running with amplitude 0-&amp;gt;1.8V (FPGA pullup) period about 30 usec (~33 kHz)&lt;br /&gt;
  1pps      1.2V (FPGA pullup)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x000000ab (171) -&amp;gt; 1010&#039;1011 -&amp;gt; data_ie, clock_ie, 1pps, data_in, clock_in&lt;br /&gt;
./test1.exe --read32 0x38&lt;br /&gt;
dsdm_read32[0x00000038] is 0x00000000 (0)&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x01 -&amp;gt; clock oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
Ddsdm_read32[0x00000034] is 0x0000008a (138) -&amp;gt; 1000&#039;1010 -&amp;gt; data_ie, 1pps, data_in, clock 0V, data 3.3V&lt;br /&gt;
&lt;br /&gt;
./test1.exe --write32 0x38 0x10 -&amp;gt; data_oe&lt;br /&gt;
./test1.exe --read32 0x34&lt;br /&gt;
dsdm_read32[0x00000034] is 0x00000029 (41) -&amp;gt; 0010&#039;1001 -&amp;gt; clock_ie, 1pps, clock_in, clock 3.3V, data 0V&lt;br /&gt;
&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --rtc-read&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
DS-DM firmware build 0x0e30d3a8, ds20k version 0x20241104&lt;br /&gt;
Read the RTC chip!&lt;br /&gt;
reg 0x00:  0 1 0 1 0 1 1 1  0x57&lt;br /&gt;
reg 0x01:  0 0 1 0 0 0 1 0  0x22&lt;br /&gt;
reg 0x02:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x03:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x04:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x05:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x06:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x07:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x08:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x09:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x10:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x11:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x12:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x13:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x14:  0 0 0 1 1 0 0 0  0x18&lt;br /&gt;
reg 0x15:  0 0 0 0 1 0 0 0  0x08&lt;br /&gt;
reg 0x16:  0 0 0 0 0 0 0 0  0x00&lt;br /&gt;
reg 0x17:  0 0 0 1 0 1 1 1  0x17&lt;br /&gt;
reg 0x18:  1 1 0 0 0 0 0 0  0xc0&lt;br /&gt;
seconds: 57, minutes: 22, hours: 00, day 0, date: 00-00-00, temp 23.75C&lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= clock chip configuration =&lt;br /&gt;
&lt;br /&gt;
file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt:&lt;br /&gt;
&lt;br /&gt;
* VCO is 14 GHz&lt;br /&gt;
* Tvco is 71.43 ps&lt;br /&gt;
* N0 divider is 14, frequency is 1000 MHz&lt;br /&gt;
* out0 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz&lt;br /&gt;
* out1 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out2 from N0 divider 0x7 is (7+1)*2 = 16, freq 62.5 MHz&lt;br /&gt;
* out3 from N0 divider 0x3 is (3+1)*2 = 8, freq 125 MHz is the feedback for zero delay&lt;br /&gt;
&lt;br /&gt;
= clock chip monitoring =&lt;br /&gt;
&lt;br /&gt;
from si5395-94-92-family.pdf:&lt;br /&gt;
* reg 0x1: page select, set to 0 or set to 5 to read 0x53F&lt;br /&gt;
* reg 0x2: 0x94&lt;br /&gt;
* reg 0x3: 0x53 -&amp;gt; device is a si5394&lt;br /&gt;
* reg 0xC: LOSXAXB&lt;br /&gt;
* reg 0xD: LOS and OOF for the 4 clock inputs&lt;br /&gt;
* reg 0xE: LOL and HOLD&lt;br /&gt;
* reg 0xF: CAL_PLL&lt;br /&gt;
* reg 0x11: sticky bits for reg 0xC&lt;br /&gt;
* reg 0x12: sticky bits for reg 0xD&lt;br /&gt;
* reg 0x13: sticky bits for reg 0xE&lt;br /&gt;
* reg 0x14: sticky bits for reg 0xF&lt;br /&gt;
* reg 0x1C: device reset&lt;br /&gt;
* reg 0x1E: low power, hard reset, SYNC&lt;br /&gt;
* reg 0x507: currently selected input clock&lt;br /&gt;
* reg 0x52A: input clock select&lt;br /&gt;
* reg 0x535: FORCE_HOLD&lt;br /&gt;
* reg 0x53F: HOLD_HIST_VALID and FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
= Install Xilinx tools =&lt;br /&gt;
&lt;br /&gt;
* install Vivado 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login at https://www.xilinx.com/myprofile.html&lt;br /&gt;
go to &amp;quot;Downloads&amp;quot;&lt;br /&gt;
go to archive,&lt;br /&gt;
find 2020.2&lt;br /&gt;
download Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
sh ./Xilinx_Unified_2020.2_1118_1232_Lin64.bin&lt;br /&gt;
banner window should open with spinner &amp;quot;downloading installation data&amp;quot;&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select install type&amp;quot; window:&lt;br /&gt;
provide email and password,&lt;br /&gt;
select &amp;quot;download image&amp;quot;&lt;br /&gt;
select directory /home/olchansk/Xilinx/Downloads/2020.2\&lt;br /&gt;
select &amp;quot;linux&amp;quot; and &amp;quot;full image&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
download summary: space required 38.52 Gbytes&lt;br /&gt;
download&lt;br /&gt;
installation progress&lt;br /&gt;
downloading spinner, 16 M/s 47 minutes...&lt;br /&gt;
&amp;quot;download image has been created successfully&amp;quot;. Ok.&lt;br /&gt;
check contents of /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
ls -l /home/olchansk/Xilinx/Downloads/2020.2&lt;br /&gt;
total 67&lt;br /&gt;
drwxr-xr-x 2 olchansk users    9 Sep  1 16:22 bin&lt;br /&gt;
drwxr-xr-x 3 olchansk users   15 Sep  1 16:23 data&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 lib&lt;br /&gt;
drwxr-xr-x 2 olchansk users  644 Sep  1 16:22 payload&lt;br /&gt;
drwxr-xr-x 2 olchansk users    7 Sep  1 16:22 scripts&lt;br /&gt;
drwxr-xr-x 4 olchansk users    4 Sep  1 16:22 tps&lt;br /&gt;
-rwxr-xr-x 1 olchansk users 3256 Nov 18  2020 xsetup&lt;br /&gt;
daq13:2020.2$ &lt;br /&gt;
./xsetup&lt;br /&gt;
spinned loading installation data&lt;br /&gt;
xilinx design tools 2022.1 now available -&amp;gt; say continue&lt;br /&gt;
&amp;quot;welcome&amp;quot; -&amp;gt; next&lt;br /&gt;
&amp;quot;select product&amp;quot; -&amp;gt; vivado -&amp;gt; next -&amp;gt; vivado hl system edition -&amp;gt; next&lt;br /&gt;
select devices: only zynq ultrascale+ mpsoc -&amp;gt; next&lt;br /&gt;
select destination: /opt/Xilinx (as root, mkdir /opt/Xilinx, chmod olchansk.users /opt/Xilinx)&lt;br /&gt;
install ...&lt;br /&gt;
complete&lt;br /&gt;
move /home/olchansk/Xilinx/Downloads/2020.2 to /daq/daqstore/olchansk/Xilinx/Downloads/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install petalinux 2020.2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
./xsetup&lt;br /&gt;
&amp;quot;a newer version is available&amp;quot; -&amp;gt; say &amp;quot;continue&amp;quot;&lt;br /&gt;
next&lt;br /&gt;
&amp;quot;select product to install&amp;quot; -&amp;gt; select Petalinux (Linux only) -&amp;gt; next&lt;br /&gt;
&amp;quot;select destination directory&amp;quot; -&amp;gt; select &amp;quot;/opt/Xilinx&amp;quot; (disk space required 2.64 GB) -&amp;gt; next&lt;br /&gt;
&amp;quot;summary&amp;quot; -&amp;gt; install ...&lt;br /&gt;
error about missing /tmp/tmp-something files&lt;br /&gt;
&amp;quot;installation completed successfully&amp;quot; (hard to dismiss, &amp;quot;ok&amp;quot; button is partially cut-off)&lt;br /&gt;
done?&lt;br /&gt;
I think it failed, /opt/Xilinx/PetaLinux/2020.2/bin is empty except for petalinux-v2020.2-final-installer.run&lt;br /&gt;
try to run it by hand, same error about /tmp/tmp-something files. strange...&lt;br /&gt;
notice it complains about &amp;quot;truncate&amp;quot;, which truncate finds ~/bin/truncate, get rid of it,&lt;br /&gt;
try again&lt;br /&gt;
now complains about missing texinfo and zlib1g:i386&lt;br /&gt;
apt install texinfo -&amp;gt; ok&lt;br /&gt;
apt install zlib1g:i386 -&amp;gt; installs bunch of gcc stuff -&amp;gt; ok&lt;br /&gt;
try again&lt;br /&gt;
reports &amp;quot;already installed&amp;quot; -&amp;gt; delete /opt/Xilinx/.xinstall/PetaLinux_2020.2/, delete entries in ~/.Xilinx/registry/installedSW.xml&lt;br /&gt;
try again&lt;br /&gt;
success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install vivado 2022.1 and petalinux 2022.1 - everything is pretty much the same&lt;br /&gt;
&lt;br /&gt;
= Petalinux =&lt;br /&gt;
&lt;br /&gt;
* cd PetaLinux_GDM_CDM&lt;br /&gt;
* petalinux-config&lt;br /&gt;
* enable i2c MAC address and DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://bitbucket.org:/team-ds-dm/ds-dm-u-boot-xlnx.git&lt;br /&gt;
cd ds-dm-u-boot-xlnx&lt;br /&gt;
git checkout ds-dm-u-boot-xlnx&lt;br /&gt;
&lt;br /&gt;
linux-components -&amp;gt;&lt;br /&gt;
uboot -&amp;gt; ext-local-src&lt;br /&gt;
external u-boot local source -&amp;gt; ds-dm-u-boot-xlnx (path to the customized uboot git repository)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable DHCP&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Subsystem AUTO Hardware Settings -&amp;gt; Ethernet Settings&lt;br /&gt;
randomize MAC address -&amp;gt; NO&lt;br /&gt;
ethernet mac address -&amp;gt; leave empty&lt;br /&gt;
obtain ip address automatically -&amp;gt; YES&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* set hostname and product names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Firmware Version Configuration -&amp;gt;&lt;br /&gt;
Host name -&amp;gt; &amp;quot;ds-dm&amp;quot;&lt;br /&gt;
Product name -&amp;gt; &amp;quot;Petalinux_GDM_CDM&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* configure linux kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable NFS-Root&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
petalinux-config&lt;br /&gt;
Image Packaging Configuration &amp;gt; Root File System Type -&amp;gt; set to NFS&lt;br /&gt;
Location of NFS root directory set to &amp;quot;/nfsroot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
petalinux-config -c kernel&lt;br /&gt;
Networking support &amp;gt; IP: kernel level configuration&lt;br /&gt;
enable DHCP, BOOTP, RARP&lt;br /&gt;
File systems &amp;gt; Network file systems &amp;gt; Root file systems on NFS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manually fix linux kernel command line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grep nfsroot PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
edit CONFIG_SUBSYSTEM_BOOTARGS_GENERATED to read&lt;br /&gt;
earlycon console=ttyPS0,115200 clk_ignore_unused panic=60 root=/dev/nfs nfsroot=/nfsroot/%s ip=dhcp rw&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check configuration in&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/config&lt;br /&gt;
** PetaLinux_GDM_CDM/project-spec/configs/rootfs_config&lt;br /&gt;
** PetaLinux_GDM_CDM/components/plnx_workspace/device-tree/device-tree/system-conf.dtsi&lt;br /&gt;
&lt;br /&gt;
= JTAG server =&lt;br /&gt;
&lt;br /&gt;
localhost:3121&lt;br /&gt;
&lt;br /&gt;
= ds20k block =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
module ds20k&lt;br /&gt;
  (&lt;br /&gt;
   //    CLOCK INPUTs&lt;br /&gt;
   input wire clk,&lt;br /&gt;
   input wire reset, // pulse for power-up reset&lt;br /&gt;
   input wire si5394_loln, // clock cleaner PLL is locked to selected input clock&lt;br /&gt;
&lt;br /&gt;
   //    REGISTER_DATA&lt;br /&gt;
   &lt;br /&gt;
   input wire [255:0] [31:0] register_data_in,&lt;br /&gt;
   output reg [255:0] [31:0] register_data_out,&lt;br /&gt;
   input wire register_write_strobe, // pulse when AXI write transaction puts new data in register_data_in&lt;br /&gt;
   input wire register_read_ack, // pulse after AXI read transaction captures data from register_data_out, used to read from FIFO&lt;br /&gt;
   &lt;br /&gt;
   //    GDM QSFP FIBER LINKS&lt;br /&gt;
   output reg [11:0] [15:0] qsfp_tx_data,&lt;br /&gt;
   output reg [11:0] [1:0]  qsfp_tx_data_is_k,&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data_error, // not sure what this is.&lt;br /&gt;
   input wire [11:0] [15:0] qsfp_rx_data,&lt;br /&gt;
   input wire [11:0] [1:0]  qsfp_rx_ctrl,&lt;br /&gt;
   input wire [11:0] qsfp_rx_is_good, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
&lt;br /&gt;
   // CDM SFP FIBER LINKS&lt;br /&gt;
   input wire 		 sfp_tx_data_ready,&lt;br /&gt;
   output reg [15:0] sfp_tx_data,&lt;br /&gt;
   output reg [1:0]  sfp_tx_data_is_k,&lt;br /&gt;
   input wire        sfp_rx_data_error, // single bit indicating that RX link is up and data is good.&lt;br /&gt;
   input wire [15:0] sfp_rx_data,&lt;br /&gt;
   input wire [1:0]  sfp_rx_data_is_k,&lt;br /&gt;
      &lt;br /&gt;
   //    VX_RXs&lt;br /&gt;
   input wire [3:0] vx1_rx,&lt;br /&gt;
   input wire [3:0] vx2_rx,  &lt;br /&gt;
   input wire [3:0] vx3_rx,  &lt;br /&gt;
   input wire [3:0] vx4_rx,  &lt;br /&gt;
   input wire [3:0] vx5_rx,  &lt;br /&gt;
   input wire [3:0] vx6_rx,  &lt;br /&gt;
   input wire [3:0] vx7_rx,  &lt;br /&gt;
   input wire [3:0] vx8_rx,&lt;br /&gt;
   input wire [3:0] vx9_rx,  &lt;br /&gt;
   input wire [3:0] vx10_rx,    &lt;br /&gt;
   input wire [3:0] vx11_rx,&lt;br /&gt;
   input wire [3:0] vx12_rx,&lt;br /&gt;
   &lt;br /&gt;
   //    VX_TXs&lt;br /&gt;
   output reg [2:0] vx1_tx_out,&lt;br /&gt;
   output reg [2:0] vx2_tx_out,&lt;br /&gt;
   output reg [2:0] vx3_tx_out,&lt;br /&gt;
   output reg [2:0] vx4_tx_out,&lt;br /&gt;
   output reg [2:0] vx5_tx_out,&lt;br /&gt;
   output reg [2:0] vx6_tx_out,&lt;br /&gt;
   output reg [2:0] vx7_tx_out,&lt;br /&gt;
   output reg [2:0] vx8_tx_out,&lt;br /&gt;
   output reg [2:0] vx9_tx_out,&lt;br /&gt;
   output reg [2:0] vx10_tx_out,&lt;br /&gt;
   output reg [2:0] vx11_tx_out,&lt;br /&gt;
   output reg [2:0] vx12_tx_out,&lt;br /&gt;
&lt;br /&gt;
   // remove input wire gdm_trg,&lt;br /&gt;
   // remove input wire gdm_tsm,&lt;br /&gt;
   &lt;br /&gt;
   //    LEMO INPUTs&lt;br /&gt;
   input wire [4:1] ext_in_lv_async, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    LEMO OUTPUTs&lt;br /&gt;
   output reg [2:1] ext_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
    &lt;br /&gt;
   //    FRONT PANEL LEDs&lt;br /&gt;
   output reg [3:0] fp_led_out, // direct connection to LEMO connectors, not clocked&lt;br /&gt;
&lt;br /&gt;
   //    trigger and tsm output&lt;br /&gt;
   // remove output reg trg_out,&lt;br /&gt;
   // remove output reg tsm_out&lt;br /&gt;
   );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= world view =&lt;br /&gt;
&lt;br /&gt;
Main components:&lt;br /&gt;
* clock distribution - to ensure all digitizers run synchronously and waveform timestamp are easy to assemble intophysics events.&lt;br /&gt;
* global trigger and run control - all digitizers are triggered at the same time to record calibration events, pulser events and the run startup synchronization sequence.&lt;br /&gt;
* busy distribution - when some digitizers go busy and stop accepting triggers, physics events may become incomplete, this must be recorded and managed.&lt;br /&gt;
* hitmap distribution - to create an online picture of the detector for monitoring and for triggering.&lt;br /&gt;
&lt;br /&gt;
== global clock distribution ==&lt;br /&gt;
&lt;br /&gt;
Clock distribution ensures all digitizers run synchronously (on the same clock) and waveform timestamps are easy to assemble into physics events. The clock source is synchronized with GPS to ensure a metrologically validated clock frequency (tied to the SI definition of 1 second) and date stamp (via GPS IRIG-B date stamp). Individual digitizer waveform timestamp are reset at the begin of run to establish a valid time zero (run start time, date stamped with the GPS IRIG-B date stamp).&lt;br /&gt;
&lt;br /&gt;
Base clock is 125 MHz (8 ns). Individual digitizers are synchronized at initialization (power-up) time. Because of incontrollable delays in the electronics (i.e. variations between individual PLL chips in each digitizer), waveform timestamps between individual digitizers may be off by 1-2 clocks (8-16 ns). After the system is running and is stable (thermally and electrically), timestamp waveform variation and jitter are less than 1 ns.&lt;br /&gt;
&lt;br /&gt;
This is validated by feeding a common calibration pulser signal into analog inputs of each digitizer (at 100 Hz) and measuring (fitting) the pulse time in the waveform. With sufficient statistics, differences between waveform timestamp are measured with picosecond precision.&lt;br /&gt;
&lt;br /&gt;
CDM PLL allows fine phase adjustment of the 62.5 MHz VX2746 clock in groups of 6 clocks (2 groups per CDM) with precision 71.43 ps.&lt;br /&gt;
&lt;br /&gt;
Due to FPGA technology limitations (serial link hard IPs, PLLs, etc) the pattern of 1-2 clock delays between individual digitizers may change/shift from power up to power up. Significant additional work would be required to ensure this pattern is repeatable and stable after every power up and initialization. As mentioned before, after power up and initialization, variation between waveform timestamp is sub-nanosecond as measured by the analog calibration pulser.&lt;br /&gt;
&lt;br /&gt;
Clock chain:&lt;br /&gt;
* GPS receiver (1pps clock reference and IRIG-B date stamp)&lt;br /&gt;
* LNGS GPS clock distribution (fiber link to converter box at the experiment)&lt;br /&gt;
* GPS 1pps to PRS-10 Rb atomic clock (10 MHz clock output)&lt;br /&gt;
* 10 MHz clock from PRS-10 to GDM PLL (extra low jitter oscillator, 125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to GDM fiber link transmitters (2.5 Gbps line rate)&lt;br /&gt;
* CDM fiber link receiver and clock recovery (125 MHz clock)&lt;br /&gt;
* 125 MHz recovered clock to CDM PLL (extra low jitter oscillator, 62.5 MHz clock output)&lt;br /&gt;
* 62.5 MHz CDM clock to VX2745 PLL via LVDS line&lt;br /&gt;
* VX2745 PLL (125 MHz clock output)&lt;br /&gt;
* 125 MHz clock to digitizer chips, clock counter and waveform timestamp.&lt;br /&gt;
&lt;br /&gt;
This is the normal mode of operation, with global clock synchronized with the GPS clock (metrologically referenced to SI 1 Hz definition).&lt;br /&gt;
&lt;br /&gt;
If GPS signal is not available, degraded modes of operation are available (in order of worsening performance)&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with a battery-powered time-of-day chip&lt;br /&gt;
* PRS-10 Rb atomic clock synchronized with Internet time (NTP) assuming Internet network connection is up&lt;br /&gt;
* PRS-10 Rb clock standalone&lt;br /&gt;
* GDM internal oscillator&lt;br /&gt;
&lt;br /&gt;
All degraded modes provide high precision low jitter 125 MHz system clock, but long term stability (seconds per day) will vary. (TBM)&lt;br /&gt;
&lt;br /&gt;
In the absence of GPS IRIG-B date stamp, the battery-powered time-of-day chip will be used (TBI) with fallback to Internet time (NTP). Date stamp long term stability is expected to be better than 1 second per day (TBI, TBM).&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* TBM: to be measured&lt;br /&gt;
* TBI: to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (April 2025):&lt;br /&gt;
* full clock chain from GDM PLL to VX2745 digitizers is implemented and tested&lt;br /&gt;
* waveform timestamp variations are measured (see report from Marek)&lt;br /&gt;
* GDM external clock is validated (using VME-GRIFFIN-CDM high quality clock source module)&lt;br /&gt;
* PRS-10 10 MHz and 1pps connection to GDM is implemented and tested&lt;br /&gt;
* GPS receiver 1pps connection to PRS-10 is implemented and tested&lt;br /&gt;
* GPS receiver IRIG-B date stamp connection to GDM tested using a software decoder. Hardware decoder and connection to time slice marker, TBI.&lt;br /&gt;
* LNGS date stamp decoder and connection to time slice marker, TBI&lt;br /&gt;
* LNGS 1pps connection to PRS-10, not available&lt;br /&gt;
* operate vertical slize system from GPS, not available (GPS is in the det lab, vertical slice is in the daq lab).&lt;br /&gt;
&lt;br /&gt;
== global trigger distribution ==&lt;br /&gt;
&lt;br /&gt;
Global trigger distribution provides a synchronous waveform trigger to all VX2745, all CDM and all VX2745 are provided wiht the same data and are all triggered at the same time (without accounting for the 1-2 clock offset described in the clock section).&lt;br /&gt;
&lt;br /&gt;
Global trigger is used for run control: the first trigger of a run resets the waveform timestamp counter, the CDM timestamp counter and the GDM timestamp counter. At the begin of run, GDM generates a sequence of triggers following an easy to identify pattern. If a VX2745 misses a trigger (for any reason), online and offline software can easily identify the tru run start time using this pattern.&lt;br /&gt;
&lt;br /&gt;
After a run has started, global trigger can be generated by a programmable pulser, by an external LEMO signal (i.e. external calibration signal, laser Q-switch, etc) and by the VX2745 trigger hitmap.&lt;br /&gt;
&lt;br /&gt;
Trigger sources (TRG):&lt;br /&gt;
* TRG pulser&lt;br /&gt;
* LEMO inputs&lt;br /&gt;
* hitmap trigger&lt;br /&gt;
&lt;br /&gt;
Time slice marker sources (TSM):&lt;br /&gt;
* TSM pulser&lt;br /&gt;
&lt;br /&gt;
Trigger chain, K-code and LVDS:&lt;br /&gt;
* TRG/TSM source&lt;br /&gt;
* TRG/TSM K-code from GDM to CDM&lt;br /&gt;
* CDM K-code to LVDS line 12 and 13 lines (TRG and TSM)&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to CDM LVDS out: TBM&lt;br /&gt;
&lt;br /&gt;
Trigger chain, packet trigger:&lt;br /&gt;
* GDM TRG/TSM source to TRG/TSM packet generator&lt;br /&gt;
* or GDM hitmap group trigger packet generator&lt;br /&gt;
* TRG/TSM packet from GDM to CDM&lt;br /&gt;
* TRG/TSM packet from CDM to VX2745 via LVDS line, 62.5 MHz, 8b10b encoding.&lt;br /&gt;
&lt;br /&gt;
Latency from GDM LEMO input to VX2745 internal trigger: TBM&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
TBM - to be measured&lt;br /&gt;
TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* LVDS TRG and TSM distribution is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM distribution from GDM to CDM is done and tested&lt;br /&gt;
* packet TRG, TRIG48 and TSM from CDM to VX2745 is done and tested&lt;br /&gt;
* packet TRIG48 processing in the VX is done and tested&lt;br /&gt;
&lt;br /&gt;
== global busy distribution ==&lt;br /&gt;
&lt;br /&gt;
If any VX2745 goes busy (for any reason) and stops accepting triggers, physics data may become incomplete. This situation needs to be recorded and managed.&lt;br /&gt;
&lt;br /&gt;
Busy chain:&lt;br /&gt;
* VX2745 firmware busy logic (CAEN and Yair) generates the VX busy signal on LVDS line 9 (CDM VX_RX_2)&lt;br /&gt;
* CDM monitors VX busy&lt;br /&gt;
* CDM records busy transitions&lt;br /&gt;
* CDM computes the &amp;quot;CDM busy&amp;quot; as grand-OR of all VX busy&lt;br /&gt;
* CDM periodically transmits CDM busy status the GDM using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* GDM receives CDM busy updates and maintains &amp;quot;CDM busy&amp;quot; for each CDM&lt;br /&gt;
* GDM records busy transitions&lt;br /&gt;
* GDM computes &amp;quot;GDM busy&amp;quot; as grand-OR of all CDM busy&lt;br /&gt;
* effectively, GDM busy is a grand-OR of all VX busy (with max delay, TBM)&lt;br /&gt;
&lt;br /&gt;
In the pilot implementation, any VX busy stops the experiment by sending a veto signal to all VX2745 which stops them from accepting triggers.&lt;br /&gt;
&lt;br /&gt;
Veto chain:&lt;br /&gt;
* GDM computes &amp;quot;GDM veto&amp;quot; as GDM busy&lt;br /&gt;
* GDM periodically transmits GDM veto status to all CDMs using special K-codes (NB: confirm transmission period)&lt;br /&gt;
* CDM receive GDM veto updates and maintain the &amp;quot;CDM veto&amp;quot; signal&lt;br /&gt;
* CDM computes &amp;quot;VX veto&amp;quot; as CDM veto&lt;br /&gt;
* CDM transmits VX veto to all VX2745 on LVDS pair 13&lt;br /&gt;
* VX2745 firmware (Yair) has VX veto block all physics triggers (NB: except for the time slice marker?)&lt;br /&gt;
&lt;br /&gt;
Total delay from VX busy to VX veto (on the LVDS lines), TBM.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full busy chain from VX to CDM to GDM is implemented, tested&lt;br /&gt;
* veto chain from GDM to CDM is implemented, tested&lt;br /&gt;
* veto chain from CDM to LVDS pair 13 is implemented, tested&lt;br /&gt;
* LVDS pair 13 veto inside the VX is implemented, tested&lt;br /&gt;
* TRG switched from LVDS pair 12 to TRG packet, testing completed&lt;br /&gt;
* TSM switched from LVDS pair 13 to TSM packet, testing completed&lt;br /&gt;
* fine tuning of busy chain, VX buffer levels, etc, test in progress&lt;br /&gt;
&lt;br /&gt;
== vx hitmap and hitmap trigger ==&lt;br /&gt;
&lt;br /&gt;
To monitor the system in real time and to generate group triggers, we use the VX hitmaps.&lt;br /&gt;
&lt;br /&gt;
Each VX2745 has 64 channels, each channel has a trigger logic block (digital discriminator) that generates a waveform self-trigger and sends a hitmap bit to the CDM (64-bits per VX2745) as a data packet. CDM passes hitmap data packets to the GDM and also records non-empty hitmap packets. CDM MIDAS frontend passes non-empty hitmap packets to MIDAS for online monitoring and visualization. GDM collects all the hitmaps and generates a global trigger. Alternatively, it generates a group trigger TRIG48 with a 48-bit bitmap indicating which VX2745 should trigger a waveform.&lt;br /&gt;
&lt;br /&gt;
Pilot implementation computes the hitmap trigger as a grand-OR of all hit maps.&lt;br /&gt;
&lt;br /&gt;
Hitmap chain:&lt;br /&gt;
* VX2745 analog inputs to digitizers to digital trigger logic block, 1 bit per channel (CAEN, Yair)&lt;br /&gt;
* 64-bits of hitmap (1 bit/channel) are collected and periodically transmitted to the CDM (Sam De Jong) (NB: confirm transmission period: see CDM page table &amp;quot;VX hit map&amp;quot; column &amp;quot;period&amp;quot;, 0xD1 clocks is 1672 ns, should be reduced to 1500 ns, TBI)&lt;br /&gt;
* VX hitmap packets are transmitted to the CDM on the LVDS line 10 (CDM VX_RX_1) at 62.5 MHz, 8b10b encoded.&lt;br /&gt;
* CDM receives hitmap packets (12 input data streams, 12-to-1 packet mux)&lt;br /&gt;
* CDM sends all hitmap packets to the GDM at 125 MHz, 16b20b encoded.&lt;br /&gt;
* non-empty hitmap packets are written to the CDM-to-CPU data FIFO (and via MIDAS frontend to MIDAS SYSTEM event buffer)&lt;br /&gt;
* grand-OR of VX hitmap packets (12*64 bits) can generate a CDM-local VX trigger&lt;br /&gt;
* GDM receives hitmap packets, computes &amp;quot;GDM hitmap trigger&amp;quot;&lt;br /&gt;
* if enabled, GDM hitmap trigger causes GDM trigger, which is processed as described in the global trigger section&lt;br /&gt;
&lt;br /&gt;
Delay, latency and jitter from analog pulse on the VX2745 analog input to VX trigger on LVDS line 12, TBM.&lt;br /&gt;
&lt;br /&gt;
TRIG48 VX group trigger:&lt;br /&gt;
* GDM receives hitmap packets, computes the 48-bit bitmap of which VX2745 modules should trigger&lt;br /&gt;
* how to specify this computation is not clear. a generic 12*64 MLU is impossible, insufficient RAM on the FPGA&lt;br /&gt;
* 48-bit bitmap is sent to all CDMs as a TRIG48 data packet&lt;br /&gt;
* CDM receives TRIG48 data packets from GDM and retransmits them to the VX2745 (all CDMs and all VXes see the same packets at the same time).&lt;br /&gt;
* VX2745 receives the 48-bit trigger bitmap, compares it with it&#039;s own 48-bit bitmap if any common bits are set, triggers waveform readout of all channels (there will be no more than 48 VX2745 in the experiment)&lt;br /&gt;
&lt;br /&gt;
Pilot implementation of TRIG48 triggers on the CDM grand-or and generates a TRIG48 packet that contains a 48-bit bitmap stored in an AXI register.&lt;br /&gt;
&lt;br /&gt;
Example uses of TRIG48:&lt;br /&gt;
* to trigger individual VX2745 modules: set the VX 48-bit map to the module number (vx05-0x1, vx06-0x2, vx07-0x4, etc), generate TRIG48 packet with a bitmap of VX modules that should trigger: 0xFFFF&#039;FFFF&#039;FFFF will trigger all modules, 0x1 will trigger only vx05, 0x2 will trigger only vx06, etc. (there is no more than 48 modules).&lt;br /&gt;
* to trigger groups of VX2745 modules: set the bitmap of group 1 modules to 0x1, set the bitmap of group 2 modules to 0x2, generate TRIG48 packet with bitmap 0x0001 to trigger only group 1 modules, 0x0002 to trigger only group 2 modules, 0x3 to trigger both groups.&lt;br /&gt;
&lt;br /&gt;
Notes:&lt;br /&gt;
* TBM - to be measured&lt;br /&gt;
* TBI - to be implemented&lt;br /&gt;
&lt;br /&gt;
Current status (Jan 2026):&lt;br /&gt;
* full chain (VX analog input to hitmap generator to CDM to GDM) is implemented, testing in progress&lt;br /&gt;
* GDM grand-or trigger is implemented&lt;br /&gt;
* VX hitmap packet generator, testing in progress (Yair firmware)&lt;br /&gt;
* CDM hitmap processing, implemented, tested&lt;br /&gt;
* GDM hitmap processing, implemented, tested&lt;br /&gt;
* pilot TRIG48 trigger generator in GDM, CDM, tested&lt;br /&gt;
* TRIG48 trigger in VX, implemented, tested&lt;br /&gt;
* MIDAS frontend readout of hitmap data from FPGA FIFO: implemented, testing in progress (FIFO code: Ian, done; integration and C++ code: KO)&lt;br /&gt;
* online monitoring and visualization in MIDAS: TBI&lt;br /&gt;
&lt;br /&gt;
== firmware map ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* red lines: clocks&lt;br /&gt;
* green lines: AXI/Avalon packet streams&lt;br /&gt;
* blue lines: serial data&lt;br /&gt;
&lt;br /&gt;
[[File:GDM-CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
== description ==&lt;br /&gt;
&lt;br /&gt;
same thing, in words:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
detector&lt;br /&gt;
digitizer, 125 MHz&lt;br /&gt;
digital filter&lt;br /&gt;
digital discriminator&lt;br /&gt;
hit map, 64 bits at 125 MHz (could be 250 MHz, filter and discriminator clock)&lt;br /&gt;
packetizer, 64 bits -&amp;gt; id, timestamp, 8x 8-bit words, eop&lt;br /&gt;
8/10 serializer, 12.5 MHz parallel in, 125 MHz serial out&lt;br /&gt;
lvds line to CDM vx_rx&lt;br /&gt;
BBB: also VX busy to lvds line to CDM vx_rx, do not want to depend on serial comm for vx busy, do not want to inject async data into the hit map packet stream&lt;br /&gt;
--- CDM&lt;br /&gt;
lvds line capture in IBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
vx rx 10/8 deserializer, vxN_rx clock, stobes out parallel data every 10 clocks at 12.5 MHz&lt;br /&gt;
vx rx phase transfer from vxN_rx clock to main CDM clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here everything is on the CDM main clock&lt;br /&gt;
vx rx packet adapter, 12.5 MHz 8-bit packets to 125 MHz 16-bit packets, internal FIFO to avoid data overrun&lt;br /&gt;
sfp tx mux, all VX packet streams into one CDM sfp tx packet stream&lt;br /&gt;
BBB: capture VX RX busy to CDM main clock (IBUF register), grand-or becomes vx_rx_busy&lt;br /&gt;
sfp tx packetizer (data,eop,vx_rx_busy -&amp;gt; data,k)&lt;br /&gt;
sfp tx 16/20 serializer, 16 bit at 125 MHz in, 2500 MHz serial out (20 bits at 125 MHz)&lt;br /&gt;
sfp tx fiber link to GDM, 2 Gigabits/sec&lt;br /&gt;
--- GDM&lt;br /&gt;
qsfp rx deserializer, 16 bit at 125 MHz output on main GDM clock&lt;br /&gt;
qsfp rx depacketizer (data,k -&amp;gt; packet data,eop; qsfp_rx_busy)&lt;br /&gt;
qsfp rx demux, hit map packets routed to GDM trigger logic block&lt;br /&gt;
GDM trigger logic block looks at hit map, generates yes/no trigger decision, encodes it as a trigger packet&lt;br /&gt;
TSM generator encodes GPS time data as a TSM packet&lt;br /&gt;
qsfp tx mux - trigger packets, tsm packets, etc to qsfp tx packet stream&lt;br /&gt;
qsfp tx packetizer (data,eop;trg,tsm,bsy -&amp;gt; data,k)&lt;br /&gt;
NB: the same tx data is sent to all 12 qsfp tx ports, to make sure we do not accidentally desync the CDMs.&lt;br /&gt;
qsfp tx 16/20 serializer, 16-bit at 125 MHz to 20-bit at 250 MHz to 2500 MHz serial out&lt;br /&gt;
qsfp tx fiber link to CDM, 2 Gigabits/sec&lt;br /&gt;
--- CDM&lt;br /&gt;
sfp rx 20/16 deserializer, 16-bit at 125 MHz&lt;br /&gt;
sfp rx depacketizer, (data,k -&amp;gt; data,eop;trg_in,tsm_in,bsy_in)&lt;br /&gt;
sfp rx demux (in reality, noop, all packets go to same place, vx tx)&lt;br /&gt;
vx tx mux (packets from GDM, packets with simulated waveforms from CDM midas frontend via AXI FIFO)&lt;br /&gt;
vx tx packet adapter 16-bit at 125 MHz to 8-bit at 12.5 MHz strobed every 10 clocks. NB: most important, this 10-clock strobe runs in sync between all CDMs!&lt;br /&gt;
vx tx phase transfer from main CDM clock to vxN_tx clock, have 10 clocks for transfer to happen&lt;br /&gt;
from here we run on the vxN_tx clock&lt;br /&gt;
vx txN serializer, 8-bit at 12.5 MHz to 125 MHz serial&lt;br /&gt;
vx_txN OBUF register, vxN_rx clock, 125 MHz clock, from PLL with adjustable phase, scan phase to find sweet spot&lt;br /&gt;
lvds line to vx&lt;br /&gt;
BBB: bsy_in from GDM is converted from pulse to level, goes out lvds line to vx, sync to vxN_tx clock&lt;br /&gt;
TTT: trg_in from GDM is a pulse, does out lvds line to vx, sync to vxN_tx clock.&lt;br /&gt;
NB: tsm is always a packet, bsy is always a signal (no packet), trg can be a packet or signal.&lt;br /&gt;
--- VX&lt;br /&gt;
lvds data captured by 125 MHz ADC sampling clock (CAEN base firmware logic)&lt;br /&gt;
lvds data connected to Yair&#039;s block&lt;br /&gt;
10/8 deserializer&lt;br /&gt;
depacketizer (data,k -&amp;gt; data,eop) to avoid accidental desync, we do not send any no trg, no tsm, no bsy K-codes.&lt;br /&gt;
demux&lt;br /&gt;
trigger packets go their way (4x 64 bit words of data go to event header: timestamps, hitmap data)&lt;br /&gt;
tsm packets go their way (4x 64 bit words of data go to tsm event header: timestamps, GPS time data)&lt;br /&gt;
BBB: bsy from lvds line stops waveform acquisition&lt;br /&gt;
TTT: trg from lvds line cause waveform acquisition, same as trg packet, but has no timestamp and other data attached to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== CDM-VX connections ==&lt;br /&gt;
&lt;br /&gt;
Note:&lt;br /&gt;
* rounded boxes are VX registers set from MIDAS&lt;br /&gt;
&lt;br /&gt;
[[File:CDM-VX.drawio.svg]]&lt;br /&gt;
&lt;br /&gt;
= Firmware registers =&lt;br /&gt;
&lt;br /&gt;
== Block 0 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4447&amp;quot;;  --GDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 0 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  USR_ACCESS_7series_inst: USR_ACCESSE2&lt;br /&gt;
    port map(-- CFGCLK =&amp;gt; CFGCLK,&lt;br /&gt;
             DATA =&amp;gt; register_data_out_block_0(0)); -- where timestamp is contained&lt;br /&gt;
             -- DATAVALID =&amp;gt; DATAVALID);&lt;br /&gt;
&lt;br /&gt;
  --static values&lt;br /&gt;
  register_data_out_block_0(1) &amp;lt;= x&amp;quot;204D4443&amp;quot;;  --CDM&amp;lt;space&amp;gt;&lt;br /&gt;
  register_data_out_block_0(2) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
  register_data_out_block_0(3) &amp;lt;= x&amp;quot;00000000&amp;quot;;  --blank&lt;br /&gt;
&lt;br /&gt;
  --Firmware Version&lt;br /&gt;
  register_data_out_block_0(4) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(5) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
  register_data_out_block_0(6) &amp;lt;= x&amp;quot;abcd0123&amp;quot;;  --Firmware version name register&lt;br /&gt;
  register_data_out_block_0(7) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware version number register&lt;br /&gt;
&lt;br /&gt;
  --Git Commit/Tag/Compile Date&lt;br /&gt;
  register_data_out_block_0(8)  &amp;lt;= x&amp;quot;0123abcd&amp;quot;;  --Firmware Git info (0-3)&lt;br /&gt;
  register_data_out_block_0(9)  &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (1)&lt;br /&gt;
  register_data_out_block_0(10) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (2)&lt;br /&gt;
  register_data_out_block_0(11) &amp;lt;= x&amp;quot;00000001&amp;quot;;  --Firmware Git info (3)&lt;br /&gt;
&lt;br /&gt;
  --Simple loopback register for testing&lt;br /&gt;
  register_data_out_block_0(12) &amp;lt;= register_data_in_block_0(12);&lt;br /&gt;
&lt;br /&gt;
  --Hardware registers (HW_ID_xDM, etc)&lt;br /&gt;
  --register_data_out_block_0(13) &amp;lt;= x&amp;quot;0000000&amp;quot; &amp;amp; &amp;quot;000&amp;quot; &amp;amp; hardware_id;&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_0_gen : for i in 14 to nregisters_block_0-1 generate&lt;br /&gt;
    register_data_out_block_0(i) &amp;lt;= register_data_in_block_0(i);&lt;br /&gt;
  end generate set_reg_block_0_gen;&lt;br /&gt;
&lt;br /&gt;
  rx_clk_sel &amp;lt;= register_data_in_block_0(12)(0); -- rx_clk select 0:clk_cc_out0, 1:rx_clk_mgt&lt;br /&gt;
&lt;br /&gt;
  rtc_i2c_clock_ie  &amp;lt;= not register_data_in_block_0(14)(0);&lt;br /&gt;
  rtc_i2c_clock_out &amp;lt;= register_data_in_block_0(14)(1);&lt;br /&gt;
  rtc_i2c_data_ie   &amp;lt;= not register_data_in_block_0(14)(4);&lt;br /&gt;
  rtc_i2c_data_out  &amp;lt;= register_data_in_block_0(14)(5);&lt;br /&gt;
  &lt;br /&gt;
  register_data_out_block_0(13) &amp;lt;= x&amp;quot;000000&amp;quot; &amp;amp; rtc_i2c_data_ie &amp;amp; rtc_i2c_data_out &amp;amp; rtc_i2c_clock_ie &amp;amp; rtc_i2c_clock_out &amp;amp; rtc_1pps_in &amp;amp; rtc_32khz_in &amp;amp; rtc_i2c_data_in &amp;amp; rtc_i2c_clock_in;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 1 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro : process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      CLK_IN_SEL_LS     &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS    &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      CLK_RSTn_LS       &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      clk_config_vec(4) &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5) &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6) &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7) &amp;lt;= &#039;1&#039;;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(3 downto 0)                &amp;lt;= register_data_in_block_1(0)(3 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)( 7 downto 0) &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_1(0)(31 downto 8) &amp;lt;= (others =&amp;gt;&#039;0&#039;);&lt;br /&gt;
      register_data_out_block_1(1)              &amp;lt;= (others =&amp;gt;&#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_1(2) &amp;lt;= register_data_in_block_1(2);&lt;br /&gt;
  register_data_out_block_1(3) &amp;lt;= register_data_in_block_1(3);&lt;br /&gt;
  register_data_out_block_1(4)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(5)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(6)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(7)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(8) &amp;lt;= register_data_in_block_1(8);&lt;br /&gt;
  register_data_out_block_1(9)(31 downto nlinks) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(10)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_1(11)                  &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw; -- &amp;amp; mgt_data_clk &amp;amp; mgt_ref_clk_raw;&lt;br /&gt;
  register_data_out_block_1(12) &amp;lt;= register_data_out_block_1(14); --MGT rx and tx reference clocks are the same&lt;br /&gt;
  register_data_out_block_1(13) &amp;lt;= register_data_out_block_1(15); --MGT rx and tx data clocks are the same&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_1(14+nfrequency_measure_clks-1 downto 14)); --see register_data_out_block_1(12,13) above&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
  zero_spare_link_registers : for i in 14+nfrequency_measure_clks to nregisters_block_1-1 generate&lt;br /&gt;
    register_data_out_block_1(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
    &lt;br /&gt;
  gdm_link_interface_inst : gdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nquads                     =&amp;gt; nquads,&lt;br /&gt;
                nlinks                     =&amp;gt; nlinks)&lt;br /&gt;
    port map(i_mgt_ref_clk_p               =&amp;gt; mgt_b_ref_clk_p,&lt;br /&gt;
             i_mgt_ref_clk_n               =&amp;gt; mgt_b_ref_clk_n,&lt;br /&gt;
             i_mgt_rx_n                    =&amp;gt; mgt_b_rx_n,&lt;br /&gt;
             i_mgt_rx_p                    =&amp;gt; mgt_b_rx_p,&lt;br /&gt;
             o_mgt_tx_n                    =&amp;gt; mgt_b_tx_n,&lt;br /&gt;
             o_mgt_tx_p                    =&amp;gt; mgt_b_tx_p,&lt;br /&gt;
           --raw, pre-pll, mgt clock for frequency measurement&lt;br /&gt;
             o_mgt_ref_clk_raw             =&amp;gt; mgt_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_1(2)(0),&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_1(3)(nlinks-1    downto 0),&lt;br /&gt;
           --data interface for the links&lt;br /&gt;
             o_data_clk                    =&amp;gt; mgt_data_clk,&lt;br /&gt;
             o_mgt_data_link_array         =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link_array         =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             o_link_power_good             =&amp;gt; register_data_out_block_1(4)(nlinks-1   downto  0),&lt;br /&gt;
             o_tx_link_up                  =&amp;gt; register_data_out_block_1(5)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_link_up                  =&amp;gt; register_data_out_block_1(6)(nlinks-1   downto  0),&lt;br /&gt;
             o_rx_error                    =&amp;gt; register_data_out_block_1(7)(nlinks-1   downto  0),&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_1(8)(0),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; register_data_out_block_1(9)(nlinks-1   downto  0),&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; mgt_debug_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#### Register Block 1 (CDM) &lt;br /&gt;
  Clock Chip and MGT Link, Control and Status Registers &lt;br /&gt;
   | Register | Axi Address | Description | note &lt;br /&gt;
   |:-|:-|:-|:-|             &lt;br /&gt;
   | 0 | 0x80011000 | Clock Chip Status and Control | CLK_IN_SEL_LS(1-0)(read-only), CLK_EXT_SEL_LS(2), CLK_RSTn_LS(3), CLK_LOSXTn_LS(4), CLK_LOLn_LS(5), CLK_I\&lt;br /&gt;
NTn_LS(6)    &lt;br /&gt;
   | 1 | 0x80011004 | free for use | |  &lt;br /&gt;
   | 2 | 0x80011008 | MGT Link Reset | mgt_rst(0), Reset for RX Error Latched(1)|    &lt;br /&gt;
   | 3 | 0x8001100c | MGT rx slide control | not needed or used |       &lt;br /&gt;
   | 4 | 0x80011010 |  link_up_and_running(10) tx_link_up_and_running(9), tx_sending_data(8), tx_link_up(7), rx_link_up_and_running(6), rx_error(5), rx_receivi\&lt;br /&gt;
ng_data(4), rx_link_up(3), link_power_good(2), sfp_rx_los(1), sfp_mod_absent(0) | Should be 0x7DC |  &lt;br /&gt;
   | 5 | 0x80011014 | reserved debug register | |        &lt;br /&gt;
   | 6-11 | ... | free for use | |    &lt;br /&gt;
   | 12 | 0x80011030 | mgt_rx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 13 | 0x80011034 | rx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 14 | 0x80011038 | mgt_tx_ref_clk_raw | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 15 | 0x8001103c | tx_clk | ~0x7735940 (125 MHz) |    &lt;br /&gt;
   | 16 | 0x80011040 | clk_50MHz | 0x2faf080 (50 MHz) |    &lt;br /&gt;
   | 17 | 0x80011044 | Register_Block1_clk | 0x5f5e100 (100 MHz) |    &lt;br /&gt;
   | 18-20 | ... | free for use | |    &lt;br /&gt;
   | 21 | 0x80011054 | free for use | |    &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1000 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1000 SFP c.c. status: 0x%08x\n&amp;quot;, reg1000);&lt;br /&gt;
            printf(&amp;quot;    CLK_IN_SEL_LS   0x%x\n&amp;quot;, (reg1000&amp;gt;&amp;gt;0) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    CLK_EXT_SEL_LS  %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_CLK_RSTn_LS %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOSXTn_LS   %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_LOLn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    CLK_INTn_LS     %d\n&amp;quot;, (reg1000&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;0x1008 SFP link reset:  0x%08x\n&amp;quot;, dev-&amp;gt;dsdm_read32(0x1008));&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1010 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1010 SFP link status: 0x%08x\n&amp;quot;, reg1010);&lt;br /&gt;
            printf(&amp;quot;    sfp_mod_absent_N       %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;0) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    sfp_rx_los_N           %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;1) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_power_good        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;2) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;3) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data      %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;4) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error               %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;5) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_lnk_up_and_running  %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;6) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up             %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;7) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_sending_data        %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;8) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_link_up_and_running %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;9) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    link_up_and_running    %d\n&amp;quot;, (reg1010&amp;gt;&amp;gt;10) &amp;amp; 1);&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0x1014 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
            printf(&amp;quot;0x1014 SFP link data:   0x%08x\n&amp;quot;, reg1014);&lt;br /&gt;
            printf(&amp;quot;    rx_data     0x%04x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;0) &amp;amp; 0xFFFF);&lt;br /&gt;
            printf(&amp;quot;    k28p1_k28p5 %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;16) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl0    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;17) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl1    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;19) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_ctrl3    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;21) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    tx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;22) &amp;amp; 3);&lt;br /&gt;
            printf(&amp;quot;    rx_state    0x%01x\n&amp;quot;, (reg1014&amp;gt;&amp;gt;24) &amp;amp; 0xF);&lt;br /&gt;
            printf(&amp;quot;    rx_receiving_data %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;28) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_up        %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;29) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_error          %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;30) &amp;amp; 1);&lt;br /&gt;
            printf(&amp;quot;    rx_link_rst       %d\n&amp;quot;, (reg1014&amp;gt;&amp;gt;31) &amp;amp; 1);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see cdm_link_establishment.vhd&lt;br /&gt;
* tx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = tx_idle&lt;br /&gt;
1 = waiting_for_rx_link&lt;br /&gt;
2 = sending_k28p1_k28p5&lt;br /&gt;
3 = sending_data&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* rx_state:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 = rx_idle&lt;br /&gt;
1 = waiting_for_ks&lt;br /&gt;
2 = rx_retry&lt;br /&gt;
3 = rx_up_switch_tx_clk_source&lt;br /&gt;
4 = waiting_for_data&lt;br /&gt;
5 = receiving_data&lt;br /&gt;
6 = rx_receive_error&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 GDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_2(0) &amp;lt;= register_data_in_block_2(0);&lt;br /&gt;
  GDM_link_data_processing_inst : GDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_2(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_2(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_2(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_2(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_2(13 downto 2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_data_clk            =&amp;gt; mgt_data_clk,&lt;br /&gt;
             i_mgt_data_link_array =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link_array =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_data_clk            =&amp;gt; data_clk,&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data,&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 2 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  clk_config_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      tx_clk_Si5394_LOLn         &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      tx_clock_status            &amp;lt;= link_up_and_running and tx_clk_Si5394_LOLn;&lt;br /&gt;
      --tx_clock_status_led        &amp;lt;= tx_clock_status;&lt;br /&gt;
      &lt;br /&gt;
      CLK_IN_SEL_LS              &amp;lt;=     clk_config_vec(1 downto 0);&lt;br /&gt;
      CLK_EXT_SEL_LS             &amp;lt;=     clk_config_vec(2); &lt;br /&gt;
      --CLK_RSTn_LS                &amp;lt;= not clk_config_vec(3);&lt;br /&gt;
      CLK_RSTn_LS                &amp;lt;= &#039;1&#039;;&lt;br /&gt;
      clk_config_vec(4)          &amp;lt;= CLK_LOSXTn_LS; &lt;br /&gt;
      clk_config_vec(5)          &amp;lt;= CLK_LOLn_LS;&lt;br /&gt;
      clk_config_vec(6)          &amp;lt;= CLK_INTn_LS;&lt;br /&gt;
      clk_config_vec(7)          &amp;lt;= tx_clock_status;&lt;br /&gt;
&lt;br /&gt;
      clk_config_vec(1 downto 0)                &amp;lt;= tx_clk_Si5394_in_select_reg_clk;&lt;br /&gt;
      clk_config_vec(3 downto 2)                &amp;lt;= register_data_in_block_2(0)(3 downto 2);&lt;br /&gt;
      register_data_out_block_2(0)(7 downto 0)  &amp;lt;= clk_config_vec(7 downto 0);&lt;br /&gt;
      register_data_out_block_2(0)(31 downto 8) &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
      register_data_out_block_2(1)              &amp;lt;= (others =&amp;gt; &#039;0&#039;); --free&lt;br /&gt;
    end if;&lt;br /&gt;
  end process clk_config_pro;&lt;br /&gt;
&lt;br /&gt;
  register_data_out_block_2(2) &amp;lt;= register_data_in_block_2(2);&lt;br /&gt;
  register_data_out_block_2(3) &amp;lt;= register_data_in_block_2(3);&lt;br /&gt;
  register_data_out_block_2(4)(10 downto 0)  &amp;lt;= link_up_and_running &amp;amp; tx_link_up_and_running &amp;amp; tx_sending_data &amp;amp; tx_link_up &amp;amp; rx_link_up_and_running &amp;amp; rx_error &amp;amp; rx_receiving_data &amp;amp; rx_link_up &amp;amp; link_power_good &amp;amp; sfp_rx_los &amp;amp; sfp_mod_present;&lt;br /&gt;
  register_data_out_block_2(4)(31 downto 11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(5) &amp;lt;= debug_data(31 downto 0);&lt;br /&gt;
  register_data_out_block_2(6) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(7) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(8) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(9) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(10) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  register_data_out_block_2(11) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
&lt;br /&gt;
  frequency_measure_clks &amp;lt;= read_write_clk &amp;amp; clk_50MHz &amp;amp; tx_clk &amp;amp; mgt_tx_ref_clk_raw &amp;amp; rx_clk &amp;amp; mgt_rx_ref_clk_raw;&lt;br /&gt;
  frequency_measure_inst : frequency_measure&lt;br /&gt;
    generic map(register_clk_frequency =&amp;gt; 100000000,&lt;br /&gt;
                max_frequency          =&amp;gt; 300000000,&lt;br /&gt;
                nfrequency_measurments =&amp;gt; nfrequency_measure_clks)&lt;br /&gt;
    port map(i_register_clk =&amp;gt; read_write_clk,&lt;br /&gt;
             i_clks         =&amp;gt; frequency_measure_clks,&lt;br /&gt;
             i_clk_locks    =&amp;gt; (others =&amp;gt;&#039;1&#039;),&lt;br /&gt;
             o_frequencies  =&amp;gt; register_data_out_block_2(12+nfrequency_measure_clks-1 downto 12));&lt;br /&gt;
&lt;br /&gt;
  zero_spare_link_registers : for i in 12+nfrequency_measure_clks to nregisters_block_2-1 generate&lt;br /&gt;
    register_data_out_block_2(i) &amp;lt;= (others =&amp;gt; &#039;0&#039;);&lt;br /&gt;
  end generate zero_spare_link_registers;&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  cdm_link_interface_inst : cdm_link_interface&lt;br /&gt;
    generic map(enable_rxslide             =&amp;gt; &#039;1&#039;,&lt;br /&gt;
                nlinks                     =&amp;gt; 1)&lt;br /&gt;
    port map(i_mgt_rx_ref_clk_p            =&amp;gt; i_CLK3_XO_125_P,&lt;br /&gt;
             i_mgt_rx_ref_clk_n            =&amp;gt; i_CLK3_XO_125_N,&lt;br /&gt;
             o_mgt_rx_rec_clk_p            =&amp;gt; o_CLK_CC_IN_P,&lt;br /&gt;
             o_mgt_rx_rec_clk_n            =&amp;gt; o_CLK_CC_IN_N,&lt;br /&gt;
             i_mgt_tx_ref_clk_p            =&amp;gt; i_CLK_CC_OUT1_P,&lt;br /&gt;
             i_mgt_tx_ref_clk_n            =&amp;gt; i_CLK_CC_OUT1_N,&lt;br /&gt;
             i_mgt_rx_n(0)                 =&amp;gt; i_SFP_RX_N,&lt;br /&gt;
             i_mgt_rx_p(0)                 =&amp;gt; i_SFP_RX_P,&lt;br /&gt;
             o_mgt_tx_n(0)                 =&amp;gt; o_SFP_TX_N,&lt;br /&gt;
             o_mgt_tx_p(0)                 =&amp;gt; o_SFP_TX_P,&lt;br /&gt;
           --raw, pre-pll, mgt clocks for frequency measurements&lt;br /&gt;
             o_mgt_rx_ref_clk_raw          =&amp;gt; mgt_rx_ref_clk_raw,&lt;br /&gt;
             o_mgt_tx_ref_clk_raw          =&amp;gt; mgt_tx_ref_clk_raw,&lt;br /&gt;
           --free running clock and reset&lt;br /&gt;
             i_mgt_free_running_clk        =&amp;gt; clk_50MHz,&lt;br /&gt;
             i_mgt_rst                     =&amp;gt; register_data_in_block_2(2)(0),&lt;br /&gt;
           -- rx and tx clocks&lt;br /&gt;
             i_rx_slide_trigger            =&amp;gt; register_data_in_block_2(3)(0 downto 0),&lt;br /&gt;
             o_tx_clk_Si5394_in_select     =&amp;gt; tx_clk_Si5394_in_select,&lt;br /&gt;
             i_tx_clk_Si5394_LOLn          =&amp;gt; tx_clk_Si5394_LOLn,&lt;br /&gt;
           --link data interface&lt;br /&gt;
             o_mgt_data_link               =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             i_mgt_data_link               =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --status ports&lt;br /&gt;
             i_status_clk                  =&amp;gt; read_write_clk,&lt;br /&gt;
             o_link_power_good(0)          =&amp;gt; link_power_good,&lt;br /&gt;
             o_rx_link_up(0)               =&amp;gt; rx_link_up,&lt;br /&gt;
             o_rx_receiving_data(0)        =&amp;gt; rx_receiving_data,&lt;br /&gt;
             o_rx_error(0)                 =&amp;gt; rx_error,&lt;br /&gt;
             o_tx_link_up(0)               =&amp;gt; tx_link_up,&lt;br /&gt;
             o_tx_sending_data(0)          =&amp;gt; tx_sending_data,&lt;br /&gt;
             i_link_down_latched_rst       =&amp;gt; register_data_in_block_2(2)(1),&lt;br /&gt;
             o_link_down_latched           =&amp;gt; open,&lt;br /&gt;
           --debug&lt;br /&gt;
             i_debug_clk                   =&amp;gt; read_write_clk,&lt;br /&gt;
             o_debug                       =&amp;gt; debug_data);&lt;br /&gt;
&lt;br /&gt;
  &lt;br /&gt;
  link_register_pro: process (read_write_clk)&lt;br /&gt;
  begin&lt;br /&gt;
    if rising_edge (read_write_clk) then&lt;br /&gt;
      link_up_and_running    &amp;lt;= tx_link_up_and_running and rx_link_up_and_running;&lt;br /&gt;
      rx_link_up_and_running &amp;lt;= not rx_error and rx_receiving_data and rx_link_up and link_power_good;&lt;br /&gt;
      tx_link_up_and_running &amp;lt;= tx_sending_data and tx_link_up and link_power_good;&lt;br /&gt;
    end if;&lt;br /&gt;
  end process;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 3 GDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 4 CDM ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  register_data_out_block_4(0) &amp;lt;= register_data_in_block_4(0);&lt;br /&gt;
  CDM_link_data_processing_inst : CDM_link_data_processing&lt;br /&gt;
    generic map(mgt_data_frequency =&amp;gt; 125000000)&lt;br /&gt;
    port map(i_register_clk        =&amp;gt; read_write_clk,&lt;br /&gt;
             i_rst                 =&amp;gt; register_data_in_block_4(0)(0),&lt;br /&gt;
             i_data_mode           =&amp;gt; register_data_in_block_4(0)( 9 downto 8),&lt;br /&gt;
             i_fixed_pattern_data  =&amp;gt; register_data_in_block_4(0)(31 downto 16),&lt;br /&gt;
             o_error_time          =&amp;gt; register_data_out_block_4(1),&lt;br /&gt;
             o_error_count         =&amp;gt; register_data_out_block_4(2),&lt;br /&gt;
           --link data interface&lt;br /&gt;
             i_mgt_data_link       =&amp;gt; mgt_link_data_to_processing,&lt;br /&gt;
             o_mgt_data_link       =&amp;gt; mgt_link_data_from_processing,&lt;br /&gt;
           --data interface&lt;br /&gt;
             o_rx_data_clk         =&amp;gt; rx_clk_mgt,  -- rx_clk&lt;br /&gt;
             o_rx_data_error       =&amp;gt; rx_data_error,&lt;br /&gt;
             o_rx_data_is_k        =&amp;gt; rx_data_is_k,&lt;br /&gt;
             o_rx_data             =&amp;gt; rx_data,&lt;br /&gt;
             o_tx_data_clk         =&amp;gt; tx_clk, --goal is to have one synchronous rx and tx clock (i.e. o_data_clock), will be changed once tested and verified&lt;br /&gt;
             o_tx_data_ready       =&amp;gt; tx_data_ready,&lt;br /&gt;
             i_tx_data_is_k        =&amp;gt; tx_data_is_k,&lt;br /&gt;
             i_tx_data             =&amp;gt; tx_data);&lt;br /&gt;
&lt;br /&gt;
  --unspecified&lt;br /&gt;
  set_reg_block_4_gen : for i in 3 to nregisters_block_4-1 generate&lt;br /&gt;
    register_data_out_block_4(i) &amp;lt;= register_data_in_block_4(i);&lt;br /&gt;
  end generate set_reg_block_4_gen;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Block 6 CDM ==&lt;br /&gt;
&lt;br /&gt;
DS20k registers&lt;br /&gt;
&lt;br /&gt;
== Block 7 CDM ==&lt;br /&gt;
&lt;br /&gt;
VX_TX and VX_RX delays, i=0..11&lt;br /&gt;
* 0x3800+4*i - VX_TX delays&lt;br /&gt;
* 0x3830+4*i - VX_RX delays&lt;br /&gt;
&lt;br /&gt;
VX_TX delay data (2 bits):&lt;br /&gt;
* 4 values: 0,1,2,3 corresponding to the 4 phases of the 125 MHz clock rx_clk and rx_clk shifted by 90 deg&lt;br /&gt;
&lt;br /&gt;
VX_RX delay data (32 bits):&lt;br /&gt;
* 0x8000&#039;0000: reset IDELAYE3, follow by write of 0&lt;br /&gt;
* 0x0001&#039;xxxx: load the IDELAYE3 9-bit tap counter, follow by write of 0x0000&#039;xxxx&lt;br /&gt;
* 16 low bits have:&lt;br /&gt;
* bits 0..8 are the 9 bits of IDELAY3 tap counter (~1.1ns for all 511 delays)&lt;br /&gt;
* bit 9 is the 500 MHz DDR phase (1 ns)&lt;br /&gt;
* bits 10..15 are 16 bits of 500 MHz delay (2 ns step)&lt;br /&gt;
* numerically increasing 16-bit delay values are carefully arranged to produce linearly increasing delay (there is some overlap between IDELAYE3 taps above ~tap 500 (or so, IDELAYE3 is uncalibrated) and flip of 500 MHz DDR phase&lt;br /&gt;
&lt;br /&gt;
== DS20k registers ==&lt;br /&gt;
&lt;br /&gt;
=== DS20k block register map ===&lt;br /&gt;
&lt;br /&gt;
* busybox devmem 0x80013000 32&lt;br /&gt;
&lt;br /&gt;
Note: R=readable, W=writable, L=latched by CMD_LATCH, B=reset on begin of run, Z=reset by CMD_LATCH&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reg | version    | xDM | xx | description&lt;br /&gt;
  0 | 0x20230731 | ALL | RO | ds20k version&lt;br /&gt;
  0 | 0x20240118 | ALL | RW | ds20k version and command&lt;br /&gt;
  1 | 0x20230731 | ALL | RW | scratch read/write register&lt;br /&gt;
  2 | 0x20230731 | ALL | RW | configure inputs and outputs&lt;br /&gt;
  3 | 0x20230731 | ALL | RW | FP_LED mux&lt;br /&gt;
  4 | 0x20230731 | ALL | RW | EXT_OUT mux&lt;br /&gt;
  5 | 0x20230731 | ALL | RO | VX_RX state&lt;br /&gt;
  6 | 0x20230731 | ALL | RO | VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state&lt;br /&gt;
  7 | 0x20230731 | ALL | RW | LED_OUT, EXT_OUT, VX_TX outputs&lt;br /&gt;
  8 | 0x20230731 | ALL | RW | VX_TX mux and config&lt;br /&gt;
  9 | 0x20230731 | ALL | RW | trg and tsm source&lt;br /&gt;
 10 | 0x20231013 | ALL | RO | status register&lt;br /&gt;
 11 | 0x20230731 | ALL | ROLB | trg counter&lt;br /&gt;
 12 | 0x20230731 | ALL | ROLB | tsm counter&lt;br /&gt;
 13 | 0x20240814 | ALL | RO | GPS 1pps period, 125 MHz&lt;br /&gt;
 14 | 0x20240814 | ALL | RO | Ru clock 1pps period, 125 MHz&lt;br /&gt;
 15 | 0x20230811 | CDM | RO | SFP RX status&lt;br /&gt;
 16 | 0x20230811 | CDM | RW | SFP TX control&lt;br /&gt;
 17 | 0x20230811 | GDM | RO | QSFP RX data 0, 1&lt;br /&gt;
 18 |            |.    |.   | 2, 3&lt;br /&gt;
 19 |            |.    |.   | 4, 5&lt;br /&gt;
 20 |            |.    |.   | 6, 7&lt;br /&gt;
 21 |            |     |.   | 8, 9&lt;br /&gt;
 22 |            |.    |.   | 10, 11&lt;br /&gt;
 23 | 0x20230811 | GDM | RW | QSFP TX control&lt;br /&gt;
 24 | 0x20231013 | ALL | RW | trigger pulser period&lt;br /&gt;
 25 | 0x20231013 | ALL | RW | trigger pulser burst control&lt;br /&gt;
 26 | 0x20231013 | ALL | RW | tsm pulser period&lt;br /&gt;
 27 | 0x20231204 | ALL | RW | data fifo CPU to FPGA&lt;br /&gt;
 28 | 0x20231204 | ALL | RW | packet loopback control&lt;br /&gt;
 28 | 0x20240118 | ALL | RW | data fifo FPGA to CPU&lt;br /&gt;
 29 | 0x20231208 | GDM | RW | bitmap of active qsfp ports&lt;br /&gt;
 29 | 0x20240118 | ALL | RW | packet loopback control&lt;br /&gt;
 29 | 0x20240510 | ALL | RW | packet routing&lt;br /&gt;
 30 | 0x20231208 | GDM | RO | qsfp link status ports 0..7&lt;br /&gt;
 31 | 0x20231208 | GDM | RO | qsfp link status ports 8..11&lt;br /&gt;
 32 | 0x20240118 | GDM | RW | enabled QSFP ports&lt;br /&gt;
 33 | 0x20240118 | CDM | RW | enabled VX ports&lt;br /&gt;
 34,35 | 0x20240118 | ALL | ROB | time stamp 64 bits&lt;br /&gt;
 36,37 | 0x20240118 | ALL | RO | old time stamp&lt;br /&gt;
 38,39,40 | 0x20240118 | CDM | ROLZ | vx_bsy_counter_latched | VX busy counters&lt;br /&gt;
 41,42,43 | 0x20240118 | GDM | ROLZ | QSFP busy counters&lt;br /&gt;
 44 | 0x20240118 | CDM | ROLZ | cdm_bsy_up_counter and cdm_bsy_pulse_counter&lt;br /&gt;
 45 | 0x20240118 | CDM | ROLZ | cdm_veto_pulse_counter and cdm_veto_up_counter&lt;br /&gt;
 46 | 0x20240118 | GDM | ROLZ | gdm_bsy_pulse_counter and gdm_bsy_up_counter&lt;br /&gt;
 47 | 0x20240118 | GDM | ROLZ | gdm_bsy_refresh_counter&lt;br /&gt;
 48 | 0x20240118 | GDM | ROLZ |  gdm_veto_up_counter and gdm_veto_pulse_counter&lt;br /&gt;
 49,50,51 | 0x20240424 | CDM | RO | VX RX serial data monitor, 8 bits per VX port&lt;br /&gt;
 52,53    | 0x20240424 | CDM | RO | VX serial link status, 4 bits per VX port&lt;br /&gt;
 54 | 0x20240424 | CDM | RO   | VX TX serial data monitor&lt;br /&gt;
 55 | 0x20240430 | ALL | RO   | QSFP, SFP and VX link loss counters&lt;br /&gt;
 56 | 0x20240510 | ALL | RO   | sfp_rx_packet_counter&lt;br /&gt;
 57 | same       | ALL | RO   | sfp_tx_packet_counter&lt;br /&gt;
 58 | same       | ALL | RO   | qsfp_rx_packet_counter[0]&lt;br /&gt;
 59 | same       | ALL | RO   | qsfp_tx_packet_counter&lt;br /&gt;
 60 | same       | ALL | RO   | vx_rx_packet_counter[0]&lt;br /&gt;
 61 | same       | ALL | RO   | vx_tx_packet_counter&lt;br /&gt;
 62 | 0x20240719 | CDM | RO   | cdm_hitmap_period, ports 0, 1&lt;br /&gt;
 63 | same       | CDM | RO   | ports 2, 3&lt;br /&gt;
 64 | same       | CDM | RO   | ports 4, 5&lt;br /&gt;
 65 | same       | CDM | RO   | ports 6, 7&lt;br /&gt;
 66 | same       | CDM | RO   | ports 8, 9&lt;br /&gt;
 67 | same       | CDM | RO   | ports 10, 11&lt;br /&gt;
 68 | 0x20240814 | ALL | RW   | GPS control and status&lt;br /&gt;
 69 | 0x20241104 | CDM | ROLB | vx_tx_trg_packet_counter | counter of TRG packets CDM-&amp;gt;VX&lt;br /&gt;
 70 | 0x20241104 | CDM | ROLB | vx_tx_tsm_packet_counter | counter of TSM packets CDM-&amp;gt;VX&lt;br /&gt;
 71 | 0x20241104 | ALL | RO   | packet error bits&lt;br /&gt;
 72,73 | 0x20241104 | CDM | ROL | vx_tx_trg_data_latched[63:0] trigger packet data&lt;br /&gt;
 74,75 | 0x20241104 | CDM | ROL | vx_tx_tsm_data_latched[63:0] tsm packet data (truncated to 64 bits)&lt;br /&gt;
 76 | 0x20241104 | CDM | ROLB | cdm_hitmap_trigger_counter_latched, counter of hitmap triggers generated in the CDM&lt;br /&gt;
 77,78,79 | 0x20241104 | CDM | ROL | vx_rx_hitmap_data_latched | VX_RX 80 bits of HITMAP packet from VX&lt;br /&gt;
 80 | 0x20241209 | CDM | RO   | vx_lvds_rx_link_status | VX LVDS link status&lt;br /&gt;
 81 | 0x20241209 | CDM | RO   | vx_lvds_rx_trg_data | VX LVDS TRG packet first 32 bits&lt;br /&gt;
 81 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 82 | 0x20241209 | CDM | RO   | vx_lvds_rx_tsm_data | VX LVDS TSM packet first 32 bits&lt;br /&gt;
 82 | 0x20251010 | CDM | -    | not used | not used&lt;br /&gt;
 83 | 0x20241209 | CDM | ROL  | vx_lvds_rx_decoded_packet_counter_latched | VX LVDS decoded packet counter&lt;br /&gt;
 84 | 0x20241209 | CDM | ROL  | vx_lvds_rx_packet_error_counter_latched | VX LVDS packet error counter&lt;br /&gt;
 85 | 0x20250417 | CDM | ROLB | vx_tx_trg_counter | VX LVDS TRG counter (VX LVDS pair 12)&lt;br /&gt;
 86 | 0x20250417 | CDM | ROLB | vx_tx_tsm_counter | VX LVDS TSM counter (VX LVDS pair 13)&lt;br /&gt;
 87 | 0x20250417 | CDM | ROLB | vx_tx_veto_counter | VX LVDS Veto counter (VX LVDS pair 13)&lt;br /&gt;
 88 | 0x20250422 | GDM | ROLB | trg_in_lost_counter | counter of TRG killed by gdm_busy&lt;br /&gt;
 89 | 0x20250422 | ALL | RO   | fifo_from_fpga_lost_packet_counter | counter of packets lost due to FIFO full&lt;br /&gt;
 90 | 0x20250428 | CDM | ROL  | vx_bsy_status_latched | status of VX busy, CDM busy, CDM veto&lt;br /&gt;
 91 | 0x20250428 | CDM | ROL  | vx_hitmap_status_latched | status of VX hitmap&lt;br /&gt;
 92 | 0x20250428 | GDM | ROL  | cdm_bdy_status_latched | status of CDM busy, GDM busy, GDM veto&lt;br /&gt;
 93 | 0x20250508 | GDM | ROL  | gdm_hitmap_status_latched | status of GDM hitmap&lt;br /&gt;
 94 | 0x20250508 | GDM | ROLB | gdm_hitmap_trigger_counter_latched | counter of hitmap triggers generated in the GDM&lt;br /&gt;
 95 | 0x20250512 | GDM | ROLB | gdm_trig48_counter_latched | counter of TRIG48 trigger packets&lt;br /&gt;
 96 | 0x20250512 | GDM | ROLB | gdm_trig48_lost_counter_latched | counter of TRIG48 triggers lost to busy&lt;br /&gt;
 97 | 0x20250512 | CDM | ROLB | vx_tx_trig48_packet_counter_latched | counter of TRIG48 packets from CDM to VX&lt;br /&gt;
 98, 99 | 0x20250512 | GDM | RW  | trig48_ctrl48, trig48_ctrl16 | GDM TRIG48 test registers&lt;br /&gt;
100,101 | 0x20251008 | CDM | ROL | vx_lvds_rx_trig48_{data,bitmap48}_latched | VX LVDS TRIG48 packet first 32 bits, bitmap48 first 32 bits&lt;br /&gt;
102 | 0x20251008 | ALL | RO   | cmd_counter | counter of reg0 commands&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 0 0x80013000 ds20k version ===&lt;br /&gt;
&lt;br /&gt;
on read: ds20k version 0xYYYYMMDD&lt;br /&gt;
&lt;br /&gt;
on write:&lt;br /&gt;
*  0 - noop - as of version 0x20240118, write a zero after writing a command&lt;br /&gt;
*  1 - cmd_reset - reset logic to good state&lt;br /&gt;
*  2 - cmd_arm_ts - arm timestamp reset&lt;br /&gt;
*  3 - cmd_trg - issue a trigger&lt;br /&gt;
*  4 - cmd_tsm - issue a tsm&lt;br /&gt;
*  5 - cmd_vx_rx_reset - reset the VX receive path&lt;br /&gt;
*  6 - cmd_vx_tx_reset - reset the VX transmit path&lt;br /&gt;
*  7 - cmd_gdm_trig48 - generate a TRIG48 trigger and data packet (GDM)&lt;br /&gt;
*  8 - cmd_trg_pulser_reset - reset the trigger pulser&lt;br /&gt;
*  9 - cmd_tsm_pulser_reset - reset the tsm pulser&lt;br /&gt;
* 10 - cmd_bor_start - start begin-of-run trigger sequence&lt;br /&gt;
* 11 - cmd_bor_clear - after run has started, clear begin-of-run status bits&lt;br /&gt;
* 12 - cmd_latch - latch counters &amp;amp; etc into AXI registers for coherent readout&lt;br /&gt;
* 13 - cmd_cdm_hitmap_trigger - generate a hitmap trigger and data packet (CDM)&lt;br /&gt;
&lt;br /&gt;
=== Register 1 0x80013004 scratch ===&lt;br /&gt;
&lt;br /&gt;
scratch read-write register&lt;br /&gt;
&lt;br /&gt;
=== Register 2 0x80013008 input and output config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | lemo_enable     | enable LEMO input 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | lemo_invert     | invert LEMO input 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 |         |                 | 3&lt;br /&gt;
  7 |         |                 | 4&lt;br /&gt;
  9 | ALL     | ext_out_disable | disable LEMO output 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 | ALL     | ext_out_invert  | invert LEMO output 1&lt;br /&gt;
 12 |         |                 | 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 3 0x8001300C FP_LED control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [15:0] led_out_mux_sel  = register_data_in[3][15:0];&lt;br /&gt;
wire [3:0]  led_out_invert   = register_data_in[3][19:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
led_out_mux_sel is 4 groups (one per LED) of 4 bits (choice 0..15):&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | led_out_reg     | register 7 bits&lt;br /&gt;
  2 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  3 | 0x20231013 | sfp_link_status | SFP link is good&lt;br /&gt;
  3 | 0x20240118 | sfp_link_status or qsfp_tx_link_rx_status | SFP/QSFP link is good&lt;br /&gt;
  4 | ALL        | lemo_in_sync[1] | LEMO input 1&lt;br /&gt;
  5 | ALL        | lemo_in_sync[2] | LEMO input 2&lt;br /&gt;
  6 | ALL        | lemo_in_sync[3] | LEMO input 3&lt;br /&gt;
  7 | ALL        | lemo_in_sync[4] | LEMO input 4&lt;br /&gt;
  8 | ALL        | ext_out[1]      | LEMO output 1&lt;br /&gt;
  9 | ALL        | ext_out[2]      | LEMO output 2&lt;br /&gt;
  A | 0x20231013 | trg_in          | trigger&lt;br /&gt;
  B | 0x20231013 | tsm_in          | time slice marker&lt;br /&gt;
  C | 0x20240118 | gdm_bsy         | GDM busy: OR of all CDM busy&lt;br /&gt;
  D | 0x20240118 | cdm_bsy         | CDM busy: OR of all VX busy&lt;br /&gt;
  E | 0x20240118 | cdm_veto        | GDM busy -&amp;gt; GDM veto -&amp;gt; CDM veto -&amp;gt; VX trigger veto&lt;br /&gt;
  F | ALL        |                 | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 4 0x80013010 LEMO OUT control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0] ext_out_mux_sel = register_data_in[4][7:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ext_out_mux_sel is 2 groups (one per LEMO) of 4 bits (choice 0..15):&lt;br /&gt;
&lt;br /&gt;
mux | version    | fpga name       | description&lt;br /&gt;
  0 | ALL        |                 | power on default&lt;br /&gt;
  1 | ALL        | ext_out_reg     | register 7&lt;br /&gt;
  2 | ALL        | trg_pulser      | pulser trigger&lt;br /&gt;
  3 | 0x20240724 | vx1_tx_out[2]   | vx1 serial data out&lt;br /&gt;
  4 | 0x20240724 | vx1_rx[1]       | vx1 serial data in&lt;br /&gt;
  5 | 0x20240724 | vx_rx_iob[0]    | vx1 serial data in captured by IOB register&lt;br /&gt;
  6 | ALL        | lemo_in_async[1]| test synchronizer&lt;br /&gt;
  7 | ALL        | lemo_in_sync[1] | test synchronizer&lt;br /&gt;
  8 | 0x20240724 | trg_in_pulse    | trigger signal&lt;br /&gt;
  9 | 0x20240724 | tsm_in_pulse    | time slice marker signal&lt;br /&gt;
  A | 0x20240118 | cdm_bsy         | CDM busy from VX&lt;br /&gt;
  B | 0x20240118 | gdm_bsy         | GDM busy from CDM&lt;br /&gt;
  C | 0x20240118 | cdm_veto        | veto from GDM to CDM to VX&lt;br /&gt;
  D | 0x20240118 | vx1_rx[1]       | serial data VX to CDM&lt;br /&gt;
  E | not used (sink)&lt;br /&gt;
  F | ALL        | 1               | fixed logic level 1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 5 0x80013014 VX_RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[5] = {&lt;br /&gt;
                vx8_rx[3], vx8_rx[2], vx8_rx[1], vx8_rx[0],&lt;br /&gt;
                vx7_rx[3], vx7_rx[2], vx7_rx[1], vx7_rx[0],&lt;br /&gt;
                vx6_rx[3], vx6_rx[2], vx6_rx[1], vx6_rx[0],&lt;br /&gt;
                vx5_rx[3], vx5_rx[2], vx5_rx[1], vx5_rx[0],&lt;br /&gt;
                vx4_rx[3], vx4_rx[2], vx4_rx[1], vx4_rx[0],&lt;br /&gt;
                vx3_rx[3], vx3_rx[2], vx3_rx[1], vx3_rx[0],&lt;br /&gt;
                vx2_rx[3], vx2_rx[2], vx2_rx[1], vx2_rx[0],&lt;br /&gt;
                vx1_rx[3], vx1_rx[2], vx1_rx[1], vx1_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 6 0x80013018 VX_RX, LEMO_IN, VX_TX, FP_LED, EXT_OUT state ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[6] = {&lt;br /&gt;
                vx2_tx_out[2], vx2_tx_out[1], vx2_tx_out[0], vx1_tx_out[2],&lt;br /&gt;
                vx1_tx_out[1], vx1_tx_out[0], ext_out[2], ext_out[1],&lt;br /&gt;
                fp_led_out[3], fp_led_out[2], fp_led_out[1], fp_led_out[0],&lt;br /&gt;
                ext_in_lv[4], ext_in_lv[3], ext_in_lv[2], ext_in_lv[1],&lt;br /&gt;
                vx12_rx[3], vx12_rx[2], vx12_rx[1], vx12_rx[0],&lt;br /&gt;
                vx11_rx[3], vx11_rx[2], vx11_rx[1], vx11_rx[0],&lt;br /&gt;
                vx10_rx[3], vx10_rx[2], vx10_rx[1], vx10_rx[0],&lt;br /&gt;
                vx9_rx[3], vx9_rx[2], vx9_rx[1], vx9_rx[0]&lt;br /&gt;
                };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | vx9_rx          | VX_RX&lt;br /&gt;
  1 |         |                 | &lt;br /&gt;
  2 |         |                 | &lt;br /&gt;
  3 |         |                 | &lt;br /&gt;
  4 | ALL     | vx10_rx         | VX_RX&lt;br /&gt;
  5 |         |                 | &lt;br /&gt;
  6 |         |                 | &lt;br /&gt;
  7 |         |                 | &lt;br /&gt;
  8 | ALL     | vx11_rx         | VX_RX&lt;br /&gt;
  9 |         |                 | &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 | ALL     | vx12_rx         | VX_RX&lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 | ALL     | ext_in_lv       | LEMO inputs&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 | ALL     | FP_LED          | FP_LEDs&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 | ALL     | ext_out[1]      | LEMO outputs&lt;br /&gt;
 25 |         | ext_out[2]      | &lt;br /&gt;
 26 | ALL     | vx1_tx          | VX1_TX&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 | ALL     | vx2_tx          | VX2_TX &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 7 0x8001301C LED_OUT, EXT_OUT, VX_TX outputs ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0] led_out_reg = register_data_in[7][3:0];&lt;br /&gt;
   wire [2:1] ext_out_reg = register_data_in[7][5:4];&lt;br /&gt;
   // register_data_in[7][6];&lt;br /&gt;
   // register_data_in[7][7];&lt;br /&gt;
   wire [7:0] vx_tx_out_reg = register_data_in[7][15:8];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version | fpga name       | description&lt;br /&gt;
  0 | ALL     | led_out_reg     | FP_LED 1&lt;br /&gt;
  1 |         |                 | 2&lt;br /&gt;
  2 |         |                 | 3&lt;br /&gt;
  3 |         |                 | 4&lt;br /&gt;
  4 | ALL     | ext_out_reg     | LEMO OUT 1&lt;br /&gt;
  5 |         |                 | 2&lt;br /&gt;
  6 | -       |                 | &lt;br /&gt;
  7 | -       |                 | &lt;br /&gt;
  8 | ALL     | vx_tx_out_reg   | VX1_TX 0&lt;br /&gt;
  9 |         |                 | 1&lt;br /&gt;
 10 |         |                 | 2&lt;br /&gt;
 11 |         |                 | -&lt;br /&gt;
 12 | ALL     |                 | VX2_TX 0&lt;br /&gt;
 13 |         |                 | 1&lt;br /&gt;
 14 |         |                 | 2&lt;br /&gt;
 15 |         |                 | -&lt;br /&gt;
 16 | -       |                 |&lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 |&lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 |&lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 |&lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 8 0x80013020 VX_TX config ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [3:0] vx_tx_mux_sel = register_data_in[8][3:0];&lt;br /&gt;
wire vx_tx_from_sfp      = register_data_in[8][30];&lt;br /&gt;
wire vx_tx_loopback      = register_data_in[8][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vx_tx_mux_sel is 4 bits (choice 0..15):&lt;br /&gt;
0 - power on default, control by vx_tx_out_reg&lt;br /&gt;
1 - GDM&lt;br /&gt;
2 - CDM&lt;br /&gt;
3 - pulser loopback test&lt;br /&gt;
4 - pulser loopback test&lt;br /&gt;
5 - 62.5 MHz output&lt;br /&gt;
6 - 125 MHz output&lt;br /&gt;
7 - trg, tsm, serial&lt;br /&gt;
8 - trg, tsm, lvds serial rx to serial tx loopback&lt;br /&gt;
9 - GPS box control (ds20k rev 0x20240814)&lt;br /&gt;
10&lt;br /&gt;
11&lt;br /&gt;
12&lt;br /&gt;
13&lt;br /&gt;
14&lt;br /&gt;
15 - production config: trg, veto, serial&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 9 trg and tsm source ===&lt;br /&gt;
&lt;br /&gt;
from version 0x20240724&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] trg_src_mask      = register_data_in[9][15:0];&lt;br /&gt;
   wire [31:16] tsm_src_mask      = register_data_in[9][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0]      trg_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     1&#039;b0,            // 15&lt;br /&gt;
                     1&#039;b0,            // 14&lt;br /&gt;
                     vx_tx_tsm_done,  // 13&lt;br /&gt;
                     vx_tx_trg_done,  // 12&lt;br /&gt;
&lt;br /&gt;
                     1&#039;b0, // gdm_hitmap_trigger, // 11&lt;br /&gt;
                     cdm_hitmap_trigger, // 10&lt;br /&gt;
                     sfp_rx_tsm,      // 9&lt;br /&gt;
                     sfp_rx_trg,      // 8&lt;br /&gt;
&lt;br /&gt;
                     sfp_rx_data[1],  // 7&lt;br /&gt;
                     sfp_rx_data[0],  // 6&lt;br /&gt;
                     tsm_pulser,      // 5&lt;br /&gt;
                     trg_pulser,      // 4&lt;br /&gt;
&lt;br /&gt;
                     lemo_in_sync[4], // 3&lt;br /&gt;
                     lemo_in_sync[3], // 2&lt;br /&gt;
                     lemo_in_sync[2], // 1&lt;br /&gt;
                     lemo_in_sync[1]  // 0&lt;br /&gt;
                     };&lt;br /&gt;
   &lt;br /&gt;
   wire [15:0]      trg_bits = trg_src_bits &amp;amp; trg_src_mask;&lt;br /&gt;
   wire [15:0]      tsm_bits = trg_src_bits &amp;amp; tsm_src_mask;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
before that:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0] trg_src_mask      = register_data_in[9][7:0];&lt;br /&gt;
   wire [7:0] tsm_src_mask      = register_data_in[9][15:8];&lt;br /&gt;
   wire       trg_pulser_enable = register_data_in[9][16];&lt;br /&gt;
   wire       tsm_pulser_enable = register_data_in[9][17];&lt;br /&gt;
   wire       trg_software      = register_data_in[9][18];&lt;br /&gt;
   wire       tsm_software      = register_data_in[9][19];&lt;br /&gt;
   // bits 20:31 not used&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wire [7:0]       xxx_src_bits =&lt;br /&gt;
                    {&lt;br /&gt;
                     sfp_rx_data[1],&lt;br /&gt;
                     sfp_rx_data[0],&lt;br /&gt;
                     tsm_pulser &amp;amp; tsm_pulser_enable,&lt;br /&gt;
                     trg_pulser &amp;amp; trg_pulser_enable,&lt;br /&gt;
                     lemo_in_sync[4],&lt;br /&gt;
                     lemo_in_sync[3],&lt;br /&gt;
                     lemo_in_sync[2],&lt;br /&gt;
                     lemo_in_sync[1]&lt;br /&gt;
                     };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
trg_src_mask and tsm_src_mask bits:&lt;br /&gt;
0 - LEMO IN 1&lt;br /&gt;
1 - LEMO IN 2&lt;br /&gt;
2 - LEMO IN 3&lt;br /&gt;
3 - LEMO IN 4&lt;br /&gt;
4 - trg_pulser&lt;br /&gt;
5 - tsm_pulser&lt;br /&gt;
6 - sfp_rx_data[0] // to become sfp_trg_in, selected from sfp_rx_data[0], cdm_rx trg_out and gdm trigger packet&lt;br /&gt;
7 - sfp_rx_data[1] // to become sfp_tsm_in, selected from sfp_rx_data[1], cdm_rx tsm_out and gdm tsm packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 10 0x80013028 status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | version    | fpga name       | description&lt;br /&gt;
  0 | 0x20231013 | pll_locked      | clock chip PLL is locked&lt;br /&gt;
  1 | 0x20240118 | ts_reset_armed  | timestamp reset is armed&lt;br /&gt;
  2 | 0x20240118 | qsfp_tx_link_rx_status | QSFP link status is good for all enabled ports&lt;br /&gt;
  3 | 0x20240424 | vx_tx_link_rx_status   | VX link status is good for all enabled ports&lt;br /&gt;
  4 | 0x20240118 | cdm_bsy         | VX busy grand-or&lt;br /&gt;
  5 | 0x20240118 | gdm_bsy         | QSFP busy grand-or &lt;br /&gt;
  6 | 0x20240118 | gdm_veto        | gdm_veto = gdm_busy &lt;br /&gt;
  7 | 0x20240118 | cdm_veto        | CDM veto from GDM to VX &lt;br /&gt;
  8 | 0x20240725 | bor_started     | begin-of-run sequence started&lt;br /&gt;
  9 | 0x20240725 | bor_finished    | begin-of-run sequence fininished, see commands 10 and 11 &lt;br /&gt;
 10 |         |                 | &lt;br /&gt;
 11 |         |                 | &lt;br /&gt;
 12 |         |                 | &lt;br /&gt;
 13 |         |                 | &lt;br /&gt;
 14 |         |                 | &lt;br /&gt;
 15 |         |                 | &lt;br /&gt;
 16 |         |                 | &lt;br /&gt;
 17 |         |                 | &lt;br /&gt;
 18 |         |                 | &lt;br /&gt;
 19 |         |                 | &lt;br /&gt;
 20 |         |                 | &lt;br /&gt;
 21 |         |                 | &lt;br /&gt;
 22 |         |                 | &lt;br /&gt;
 23 |         |                 | &lt;br /&gt;
 24 |         |                 | &lt;br /&gt;
 25 |         |                 | &lt;br /&gt;
 26 |         |                 | &lt;br /&gt;
 27 |         |                 | &lt;br /&gt;
 28 |         |                 |&lt;br /&gt;
 29 |         |                 | &lt;br /&gt;
 30 |         |                 | &lt;br /&gt;
 31 |         |                 | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 11 0x8001302C trg_counter ===&lt;br /&gt;
&lt;br /&gt;
trigger counter&lt;br /&gt;
&lt;br /&gt;
=== Register 12 0x80013030 tsm_counter ===&lt;br /&gt;
&lt;br /&gt;
time slice marker counter&lt;br /&gt;
&lt;br /&gt;
=== Register 13 0x80013034 GPS 1pps period ===&lt;br /&gt;
&lt;br /&gt;
GPS 1pps period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 14 0x80013038 Rb clock 1pps period ===&lt;br /&gt;
&lt;br /&gt;
PRS-10 Rb clock 1pps output period in 8 ns clocks&lt;br /&gt;
&lt;br /&gt;
=== Register 15 0x8001303C SFP RX status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bit | ds20k version | fpga signal name | description&lt;br /&gt;
  0 | ALL        | sfp_rx_data[15:0]   | cdm sfp received data&lt;br /&gt;
 16 | same       | sfp_rx_data_is_k[0] | &lt;br /&gt;
 17 | same       | sfp_rx_data_is_k[1] | &lt;br /&gt;
 18 |            | 0                   | &lt;br /&gt;
 19 | 0x20231204 | sfp_rx_sel_lpb      | sfp tx-&amp;gt;rx loopback&lt;br /&gt;
 20 | 0x20231013 | sfp_link_status     | sfp link connected, exchanging data&lt;br /&gt;
 21 | same       | sfp_link_rx_status  | sfp link receiving correct idle pattern from GDM TX&lt;br /&gt;
 22 | same       | sfp_link_error      | sfp link receiver error (badk or overflow)&lt;br /&gt;
 23 | same       | sfp_rx_data_error   | sfp transceiver state machine is in error state&lt;br /&gt;
 24 |            |                     | &lt;br /&gt;
 25 |            |                     | &lt;br /&gt;
 26 |            |                     | &lt;br /&gt;
 27 |            |                     | &lt;br /&gt;
 28 |            |                     |&lt;br /&gt;
 29 |            |                     | &lt;br /&gt;
 30 |            |                     | &lt;br /&gt;
 31 |            |                     | &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 16 SFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] sfp_tx_data_reg = register_data_in[16][15:0];  // SFP TX data K-code&lt;br /&gt;
   wire [1:0]  sfp_tx_ctrl_reg = register_data_in[16][17:16]; // SFP TX data K-code&lt;br /&gt;
   // 18&lt;br /&gt;
   // 19&lt;br /&gt;
   // 23:20&lt;br /&gt;
   // 27:24&lt;br /&gt;
   wire sfp_rx_sel_lpb         = register_data_in[16][28]; // TX-&amp;gt;RX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_lpb         = register_data_in[16][29]; // RX-&amp;gt;TX serial loopback&lt;br /&gt;
   wire sfp_tx_sel_trg         = register_data_in[16][30]; // 16 individual bits&lt;br /&gt;
   wire sfp_tx_sel_reg         = register_data_in[16][31]; // TX data from register 16 bits 17:0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 17-22 QSFP RX data ===&lt;br /&gt;
&lt;br /&gt;
QSFP RX data links 0..11&lt;br /&gt;
&lt;br /&gt;
=== Register 23 QSFP TX control ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [15:0] qsfp_tx_data_reg = register_data_in[23][15:0];&lt;br /&gt;
   wire [1:0]  qsfp_tx_ctrl_reg = register_data_in[23][17:16];&lt;br /&gt;
&lt;br /&gt;
   wire qsfp_tx_enable_trg      = register_data_in[23][24]; // enable QSFP TX trg_in_pulse k-code&lt;br /&gt;
   wire qsfp_tx_enable_tsm      = register_data_in[23][25]; // enable QSFP TX tsm_in_pulse k-code&lt;br /&gt;
  &lt;br /&gt;
   //wire qsfp_rx_sel_lpb         = register_data_in[23][28]; // TX-&amp;gt;RX loopback&lt;br /&gt;
   wire qsfp_tx_sel_lpb         = register_data_in[23][29]; // RX-&amp;gt;TX loopback&lt;br /&gt;
   wire qsfp_tx_sel_trg         = register_data_in[23][30]; // 16 individual bits&lt;br /&gt;
   wire qsfp_tx_sel_reg         = register_data_in[23][31]; // data from register&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 24 0x80013060 trigger pulser period ===&lt;br /&gt;
&lt;br /&gt;
trigger pulser period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 25 0x80013064 trigger burst pulser ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [7:0]         conf_burst_count  = conf_pulser_burst_ctrl[31:24];&lt;br /&gt;
   wire [23:0]        conf_burst_period = conf_pulser_burst_ctrl[23:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 26 0x80013068 tsm pulser period ===&lt;br /&gt;
&lt;br /&gt;
time slice marker period in units of 8 ns (125 MHz clock)&lt;br /&gt;
&lt;br /&gt;
=== Register 27 0x8001306C data write fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[27][31];&lt;br /&gt;
   wire        fifo_to_fpga_wr1 = register_data_in[27][27];&lt;br /&gt;
   wire        fifo_to_fpga_wr2 = register_data_in[27][26];&lt;br /&gt;
   wire [16:0] fifo_to_fpga_din = register_data_in[27][16:0];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[27][31:24] = register_data_in[27][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[27][23] = fifo_to_fpga_full;&lt;br /&gt;
   assign register_data_out[27][22] = fifo_to_fpga_empty;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 28 0x80013070 data read fifo ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire        fifo_reset = register_data_in[28][31];&lt;br /&gt;
   wire        fifo_from_fpga_rd1 = register_data_in[28][25];&lt;br /&gt;
   wire        fifo_from_fpga_rd2 = register_data_in[28][24];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[28][31:24] = register_data_in[28][31:24]; // echo write bits&lt;br /&gt;
   assign register_data_out[28][21] = fifo_from_fpga_full;&lt;br /&gt;
   assign register_data_out[28][20] = fifo_from_fpga_empty;&lt;br /&gt;
   assign register_data_out[28][16:0] = fifo_from_fpga_dout;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 29 0x80013074 packet routing ===&lt;br /&gt;
&lt;br /&gt;
Control packet routing and loopbacks:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [3:0]  dn_route_ctrl             = register_data_in[29][3:0];&lt;br /&gt;
   wire [3:0]  up_route_ctrl             = register_data_in[29][7:4];&lt;br /&gt;
   wire [3:0]  fifo_to_fpga_route_ctrl   = register_data_in[29][11:8];&lt;br /&gt;
   //wire [3:0]  spare_route_ctrl        = register_data_in[29][15:12];&lt;br /&gt;
&lt;br /&gt;
   wire        dn_mux_trg_enable         = register_data_in[29][16];&lt;br /&gt;
   wire        dn_mux_tsm_enable         = register_data_in[29][17];&lt;br /&gt;
   wire        dn_mux_sfp_rx_fifo_enable = register_data_in[29][18];&lt;br /&gt;
   // 19&lt;br /&gt;
   // 20..23&lt;br /&gt;
&lt;br /&gt;
   wire        up_mux_vx_rx_enable       = register_data_in[29][24];&lt;br /&gt;
   // 25&lt;br /&gt;
   // 26&lt;br /&gt;
   // 27&lt;br /&gt;
   wire        fifo_from_fpga_hitmap_enable       = register_data_in[29][28];&lt;br /&gt;
   wire        fifo_from_fpga_cdm_busy_enable     = register_data_in[29][29];&lt;br /&gt;
   wire        fifo_from_fpga_gdm_busy_enable     = register_data_in[29][30];&lt;br /&gt;
   wire        fifo_from_fpga_tsm_enable          = register_data_in[29][31];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fifo_to_fpga output routing:&lt;br /&gt;
* 0 - to down packet mux&lt;br /&gt;
* 1 - to up packet mux&lt;br /&gt;
* 2 - to fifo_from_fpga mux&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
down packet mux inputs:&lt;br /&gt;
* fifo_to_fpga_0&lt;br /&gt;
* trg_pkt16 enabled by dn_mux_trg_enable&lt;br /&gt;
* tsm_pkt16 enabled by dn_mux_tsm_enable&lt;br /&gt;
* sfp_rx_fifo_pkt16 enabled by dn_mux_sfp_rx_fifo_enable&lt;br /&gt;
* up_pkt16_2 loopback from up packet mux&lt;br /&gt;
&lt;br /&gt;
down packet mux output routing:&lt;br /&gt;
* 0 - to vx_tx_pkt16 to VX TX (vx_link_tx and vx_ser_tx)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to up packet mux loopback&lt;br /&gt;
* 3 - to qsfp_tx_pkt16 to GDM QSFP TX (cdm_link_tx)&lt;br /&gt;
&lt;br /&gt;
up packet mux inputs:&lt;br /&gt;
* vx_rx_pkt16 enabled by up_mux_vx_rx_enable data from 12 VX RX links&lt;br /&gt;
* fifo_to_fpga_1&lt;br /&gt;
* dn_pkt16_2 loopback from down packet mux&lt;br /&gt;
&lt;br /&gt;
up packet mux output routing:&lt;br /&gt;
* 0 - to sfp_tx_pkt16 to CDM SFP TX (VX data to GDM)&lt;br /&gt;
* 1 - to fifo_from_fpga mux&lt;br /&gt;
* 2 - to down packet mux loop loopback&lt;br /&gt;
* 3 - not used&lt;br /&gt;
&lt;br /&gt;
internal_mux inputs:&lt;br /&gt;
* 0 - cdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable (reg 29)&lt;br /&gt;
* 1 - cdm_busy_pkt16 enabled by fifo_from_fpga_cdm_busy_enable&lt;br /&gt;
* 2 - gdm_busy_pkt16 enabled by fifo_from_fpga_gdm_busy_enable&lt;br /&gt;
* 3 - gdm_hitmap_pkt16 enabled by fifo_from_fpga_hitmap_enable&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
debug_mux inputs:&lt;br /&gt;
* 0 - not used&lt;br /&gt;
* 1 - dn_pkt16_1&lt;br /&gt;
* 2 - up_pkt16_1&lt;br /&gt;
* 3 - qsfp0_rx_pkt16 enabled by fifo_from_fpga_qsfp0_rx_enable (from GDM QSFP link 0, there is no GDM QSFP 12-to-1 mux)&lt;br /&gt;
* 4 - not used&lt;br /&gt;
&lt;br /&gt;
fifo_from_fpga mux inputs:&lt;br /&gt;
* 0 - fifo_to_fpga_2&lt;br /&gt;
* 1 - tsm2_pkt16 enabled by fifo_from_fpga_tsm_enable (reg 29)&lt;br /&gt;
* 2 - not used&lt;br /&gt;
* 3 - debug_pkt16 from debug_mux&lt;br /&gt;
* 4 - internal_pkt16 from internal_mux&lt;br /&gt;
&lt;br /&gt;
=== Register 30 0x80013078 qsfp link status ports 0..7 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[30] = &lt;br /&gt;
     {&lt;br /&gt;
       qsfp_rx_data_error[7], qsfp_link_error[7], qsfp_link_status[7], qsfp_link_rx_status[7], // 7&lt;br /&gt;
       qsfp_rx_data_error[6], qsfp_link_error[6], qsfp_link_status[6], qsfp_link_rx_status[6], // 6&lt;br /&gt;
       qsfp_rx_data_error[5], qsfp_link_error[5], qsfp_link_status[5], qsfp_link_rx_status[5], // 5&lt;br /&gt;
       qsfp_rx_data_error[4], qsfp_link_error[4], qsfp_link_status[4], qsfp_link_rx_status[4], // 4&lt;br /&gt;
       qsfp_rx_data_error[3], qsfp_link_error[3], qsfp_link_status[3], qsfp_link_rx_status[3], // 3&lt;br /&gt;
       qsfp_rx_data_error[2], qsfp_link_error[2], qsfp_link_status[2], qsfp_link_rx_status[2], // 2&lt;br /&gt;
       qsfp_rx_data_error[1], qsfp_link_error[1], qsfp_link_status[1], qsfp_link_rx_status[1], // 1&lt;br /&gt;
       qsfp_rx_data_error[0], qsfp_link_error[0], qsfp_link_status[0], qsfp_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 31 0x8001307C qsfp link status ports 8..11 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[31] = &lt;br /&gt;
     {&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       4&#039;b0000,&lt;br /&gt;
       qsfp_rx_data_error[11], qsfp_link_error[11], qsfp_link_status[11], qsfp_link_rx_status[11], // 11&lt;br /&gt;
       qsfp_rx_data_error[10], qsfp_link_error[10], qsfp_link_status[10], qsfp_link_rx_status[10], // 10&lt;br /&gt;
       qsfp_rx_data_error[9],  qsfp_link_error[9],  qsfp_link_status[9],  qsfp_link_rx_status[9],  // 9&lt;br /&gt;
       qsfp_rx_data_error[8],  qsfp_link_error[8],  qsfp_link_status[8],  qsfp_link_rx_status[8]   // 8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 32 0x80013080 bitmap of enabled qsfp ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  qsfp_mask       = register_data_in[32][11:0];&lt;br /&gt;
   wire         qsfp_bsy_force  = register_data_in[32][12];&lt;br /&gt;
   wire         gdm_veto_enable = register_data_in[32][13];&lt;br /&gt;
   // not used                  = register_data_in[32][15:14];&lt;br /&gt;
   wire [15:0]  gdm_veto_extend = register_data_in[32][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the GDM:&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy[11..0] are pulses received from the CDMs&lt;br /&gt;
&lt;br /&gt;
qsfp_rx_bsy_or is the grand-or of qsfp_rx_bsy masked by qsfp_mask&lt;br /&gt;
&lt;br /&gt;
if qsfp_rx_bsy_or is high, gdm_bsy goes up and stays up for vx_bsy_extend*2 clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto = gdm_bsy (bsy of any one VX causes trigger veto to all of them)&lt;br /&gt;
&lt;br /&gt;
if (gdm_veto_enable) then gdm_veto will block trg_in_pulse&lt;br /&gt;
&lt;br /&gt;
gdm_veto transition 0-&amp;gt;1 causes gdm_veto_pulse. as long as gdm_veto is high, gdm_veto_pulse is generated every gdm_veto_extend clocks&lt;br /&gt;
&lt;br /&gt;
gdm_veto_pulse is sent to all CDMs.&lt;br /&gt;
&lt;br /&gt;
For this to work right, cdm_bsy_extend should not be bigger than gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
=== Register 33 0x80013084 bitmap of enabled VX ports ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire [11:0]  vx_mask       = register_data_in[33][11:0];&lt;br /&gt;
   wire         vx_bsy_force  = register_data_in[33][12];&lt;br /&gt;
   // not used                = register_data_in[33][15:13];&lt;br /&gt;
   wire [15:0]  vx_bsy_extend = register_data_in[33][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the CDM:&lt;br /&gt;
&lt;br /&gt;
cdm_bsy is a grand-or of all vx_bsy masked by vx_mask (list of active VXes).&lt;br /&gt;
&lt;br /&gt;
vx_bsy_extend controls how often state of cdm_bsy is sent to the GDM. when cdm_bsy goes 0-&amp;gt;1, we send a cdm_bsy_pulse and keep resending it every vx_bsy_extend clocks as long as cdm_bsy stays high.&lt;br /&gt;
&lt;br /&gt;
cdm_bsy_pulse is sent to the GDM.&lt;br /&gt;
&lt;br /&gt;
sfp_rx_veto is the received from the GDM&lt;br /&gt;
&lt;br /&gt;
if sfp_rx_veto goes up, cdm_veto goes up and stays up for gdm_veto_extend clocks.&lt;br /&gt;
&lt;br /&gt;
for this to work right, CDM gdm_veto_extend must be bigger than GDM gdm_veto_extend.&lt;br /&gt;
&lt;br /&gt;
cdm_veto goes to VXes on v1_tx_out[1] which is LVDS input 13.&lt;br /&gt;
&lt;br /&gt;
=== Register 34, 35 0x80013088, 8C current timestamp ===&lt;br /&gt;
&lt;br /&gt;
current 64-bit timestamp, 125 MHz&lt;br /&gt;
&lt;br /&gt;
=== Register 36, 37 0x80013090, 94 old timestamp ===&lt;br /&gt;
&lt;br /&gt;
old 64-bit timestamp, 125 MHz. timestamp saved at run start when it is reset to 0.&lt;br /&gt;
&lt;br /&gt;
=== Register 38, 39, 40 0x80013098, 9C, A0 VX busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per VX port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 41, 42, 43 0x800130A4, A8, AC QSFP busy counters ===&lt;br /&gt;
&lt;br /&gt;
8 bits per QSFP port, counters overflow to 255, reset at run start.&lt;br /&gt;
&lt;br /&gt;
=== Register 44, 45, 46, 47, 48 CDM and GDM busy and veto counters ===&lt;br /&gt;
&lt;br /&gt;
* cdm_busy = grand-or of all VX busy for enabled VXes&lt;br /&gt;
* gdm_busy = grand-or of all CDM busy for enabled CDMs&lt;br /&gt;
* gdm_veto = gdm_busy&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 44 | lo 16 bits | cdm_bsy_up_counter      | CDM busy, increments when cdm_busy goes 0-&amp;gt;1&lt;br /&gt;
 44 | hi 16 bits | cdm_bsy_pulse_counter   | CDM busy to GDM, increments for each cdm_bsy_pulse sent to the GDM&lt;br /&gt;
&lt;br /&gt;
 45 | lo 16 bits | cdm_veto_pulse_counter  | CDM veto from GDM, increments for each sfp_rx_veto received from the GDM&lt;br /&gt;
 45 | hi 16 bits | cdm_veto_up_counter     | CDM veto to VX, increments each time cdm_veto is set to 1.&lt;br /&gt;
&lt;br /&gt;
 46 | lo 16 bits | gdm_bsy_pulse_counter   | GDM busy from CDM, increments for each qsfp_rx_busy received from CDMs (unless they overlap)&lt;br /&gt;
 46 | hi 16 bits | gdm_bsy_up_counter      | GDM busy, increments each time gdm_bsy goes 0-&amp;gt;1&lt;br /&gt;
&lt;br /&gt;
 47 | lo 16 bits | gdm_bsy_refresh_counter | GDM busy, increments each time gdm_bsy is extended by new qsfp_rx_busy&lt;br /&gt;
 47 | hi 16 bits | spare                   |&lt;br /&gt;
&lt;br /&gt;
 48 | lo 16 bits | gdm_veto_up_counter     | GDM veto, increments each time gdm_veto goes 0-&amp;gt;1&lt;br /&gt;
 48 | hi 16 bits | gdm_veto_pulse_counter  | GDM veto to CDM, increments for each gdm_veto_pulse sent to the CDM&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 49, 50, 51 0x800130xx VX RX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
VX RX data, 8-bit per VX channel. k-bit is omitted.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[49][7:0]   = vx_rx_data[0]; // vx1&lt;br /&gt;
   assign register_data_out[49][15:8]  = vx_rx_data[1]; // vx2&lt;br /&gt;
   assign register_data_out[49][23:16] = vx_rx_data[2]; // vx3&lt;br /&gt;
   assign register_data_out[49][31:24] = vx_rx_data[3]; // vx4&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[50][7:0]   = vx_rx_data[4]; // vx5&lt;br /&gt;
   assign register_data_out[50][15:8]  = vx_rx_data[5]; // vx6&lt;br /&gt;
   assign register_data_out[50][23:16] = vx_rx_data[6]; // vx7&lt;br /&gt;
   assign register_data_out[50][31:24] = vx_rx_data[7]; // vx8&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[51][7:0]   = vx_rx_data[8]; // vx9&lt;br /&gt;
   assign register_data_out[51][15:8]  = vx_rx_data[9]; // vx10&lt;br /&gt;
   assign register_data_out[51][23:16] = vx_rx_data[10]; // vx11&lt;br /&gt;
   assign register_data_out[51][31:24] = vx_rx_data[11]; // vx12&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 52, 53 VX link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[52] = &lt;br /&gt;
     {&lt;br /&gt;
       vx_rx_error[7], vx_link_error[7], vx_link_status[7], vx_link_rx_status[7], // 7&lt;br /&gt;
       vx_rx_error[6], vx_link_error[6], vx_link_status[6], vx_link_rx_status[6], // 6&lt;br /&gt;
       vx_rx_error[5], vx_link_error[5], vx_link_status[5], vx_link_rx_status[5], // 5&lt;br /&gt;
       vx_rx_error[4], vx_link_error[4], vx_link_status[4], vx_link_rx_status[4], // 4&lt;br /&gt;
       vx_rx_error[3], vx_link_error[3], vx_link_status[3], vx_link_rx_status[3], // 3&lt;br /&gt;
       vx_rx_error[2], vx_link_error[2], vx_link_status[2], vx_link_rx_status[2], // 2&lt;br /&gt;
       vx_rx_error[1], vx_link_error[1], vx_link_status[1], vx_link_rx_status[1], // 1&lt;br /&gt;
       vx_rx_error[0], vx_link_error[0], vx_link_status[0], vx_link_rx_status[0]  // 0&lt;br /&gt;
      };&lt;br /&gt;
&lt;br /&gt;
   assign register_data_out[53] = &lt;br /&gt;
     {&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       1&#039;b0, ~vx_rx_deser_rdy[0], vx_rx_code_err[0], vx_rx_disp_err[0],&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       //4&#039;b0000,&lt;br /&gt;
       vx_rx_monitor[0],&lt;br /&gt;
       vx_rx_error[11], vx_link_error[11], vx_link_status[11], vx_link_rx_status[11], // 11&lt;br /&gt;
       vx_rx_error[10], vx_link_error[10], vx_link_status[10], vx_link_rx_status[10], // 10&lt;br /&gt;
       vx_rx_error[9],  vx_link_error[9],  vx_link_status[9],  vx_link_rx_status[9],  //  9&lt;br /&gt;
       vx_rx_error[8],  vx_link_error[8],  vx_link_status[8],  vx_link_rx_status[8]   //  8&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
vx_rx_monitor (12-bit) is from deserializer_10b.sv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[9:0] = lastByte[9:0];&lt;br /&gt;
   assign monitor_out[10]  = comma;&lt;br /&gt;
   assign monitor_out[11]  = ready;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 54 VX TX serial data monitor ===&lt;br /&gt;
&lt;br /&gt;
* contents of vx_tx_monitor from vx_ser_tx.sv:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign monitor_out[8:0]   = data_to_encoder; // 8-bit + k&lt;br /&gt;
   assign monitor_out[9]     = valid;&lt;br /&gt;
   assign monitor_out[15:10] = 0;&lt;br /&gt;
   assign monitor_out[25:16] = encoded_data; // 10-bit&lt;br /&gt;
   assign monitor_out[26]    = encoded_valid;&lt;br /&gt;
   assign monitor_out[27]    = 0;&lt;br /&gt;
   assign monitor_out[31:28] = 0;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 55 QSFP, SFP, VX link loss counters ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[55] = {&lt;br /&gt;
  vx_rx_error_counter,&lt;br /&gt;
  qsfp_link_rx_status_drop_counter,&lt;br /&gt;
  sfp_link_rx_status_drop_counter,&lt;br /&gt;
  vx_link_rx_status_drop_counter&lt;br /&gt;
};&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
24..31 - CDM VX RX error counters, count any errors in the VX RX data path (bad serial data, fifo overflow, etc)&lt;br /&gt;
16..23 - GDM QSFP link loss counter, increments on qsfp_tx_link_rx_status 1-&amp;gt;0 (reg10)&lt;br /&gt;
 8..15 - CDM SFP  link loss counter, increments on sfp_link_rx_status     1-&amp;gt;0 (reg15)&lt;br /&gt;
 0...7 - CDM VX   link loss counter, increments on vx_tx_link_rx_status   1-&amp;gt;0 (reg10)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 68 GPS control and status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
assign register_data_out[68] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,      // 23+8&lt;br /&gt;
      rb_1pps_counter,  // 16+8 bits&lt;br /&gt;
      gps_1pps_counter, // 8+8 bits&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      1&#039;b0,&lt;br /&gt;
      rb_ser_in,   // 5&lt;br /&gt;
      gps_data_in, // 4&lt;br /&gt;
      gps_aux_out, // 3&lt;br /&gt;
      gps_aux_in,  // 2&lt;br /&gt;
      rb_1pps_in,  // 1&lt;br /&gt;
      gps_1pps_in  // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 71 packet error bits ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign register_data_out[71] =&lt;br /&gt;
     {&lt;br /&gt;
      8&#039;b00000000,  // 24+8 bits&lt;br /&gt;
      1&#039;b0, // 23&lt;br /&gt;
      1&#039;b0, // 22&lt;br /&gt;
      fifo_to_fpga_full_latch,      // 21&lt;br /&gt;
      fifo_from_fpga_full_latch,    // 20&lt;br /&gt;
      gdm_hitmap_fifo_full_latch,   // 19&lt;br /&gt;
      gdm_busy_fifo_full_latch,     // 18&lt;br /&gt;
      cdm_busy_fifo_full_latch,     // 17&lt;br /&gt;
      cdm_hitmap_fifo_full_latch,   // 16&lt;br /&gt;
      1&#039;b0, // 15&lt;br /&gt;
      1&#039;b0, // 14&lt;br /&gt;
      1&#039;b0, // 13&lt;br /&gt;
      gdm_trig48_encode_error_latch, // 12&lt;br /&gt;
      1&#039;b0, // vx_tx_trig48_pkt8_error_latch, // 11&lt;br /&gt;
      tsm2_encode_error_latch,       // 10&lt;br /&gt;
      tsm_encode_error_latch,        // 9&lt;br /&gt;
      trg_encode_error_latch,        // 8&lt;br /&gt;
      gdm_hitmap_error_latch,        // 7&lt;br /&gt;
      gdm_hitmap_encode_error_latch, // 6&lt;br /&gt;
      gdm_busy_encode_error_latch,   // 5&lt;br /&gt;
      cdm_busy_encode_error_latch,   // 4&lt;br /&gt;
      cdm_hitmap_encode_error_latch, // 3&lt;br /&gt;
      vx_rx_hitmap_error_latch,      // 2&lt;br /&gt;
      1&#039;b0, // vx_tx_tsm_pkt8_error_latch,    // 1&lt;br /&gt;
      1&#039;b0, // vx_tx_trg_pkt8_error_latch     // 0&lt;br /&gt;
      };&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 90 VX busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         vx_bsy_status_latched[11:0]  &amp;lt;= vx_bsy[11:0];&lt;br /&gt;
         vx_bsy_status_latched[23:12] &amp;lt;= vx_bsy_collect[11:0];&lt;br /&gt;
         vx_bsy_status_latched[24]    &amp;lt;= cdm_bsy;&lt;br /&gt;
         vx_bsy_status_latched[25]    &amp;lt;= cdm_bsy_collect;&lt;br /&gt;
         vx_bsy_status_latched[26]    &amp;lt;= cdm_veto;&lt;br /&gt;
         vx_bsy_status_latched[27]    &amp;lt;= cdm_veto_collect;&lt;br /&gt;
         vx_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         vx_bsy_status_latched[31]    &amp;lt;= cdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 91 VX hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_or12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_or12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 92 GDM busy status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         gdm_bsy_status_latched[11:0]  &amp;lt;= qsfp_rx_bsy[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[23:12] &amp;lt;= qsfp_rx_bsy_collect[11:0];&lt;br /&gt;
         gdm_bsy_status_latched[24]    &amp;lt;= gdm_bsy;&lt;br /&gt;
         gdm_bsy_status_latched[25]    &amp;lt;= gdm_bsy_collect;&lt;br /&gt;
         gdm_bsy_status_latched[26]    &amp;lt;= gdm_veto;&lt;br /&gt;
         gdm_bsy_status_latched[27]    &amp;lt;= gdm_veto_collect;&lt;br /&gt;
         gdm_bsy_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         gdm_bsy_status_latched[31]    &amp;lt;= gdm_bsy_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 93 GDM hitmap status register ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
         hitmap_status_latched[11:0]  &amp;lt;= hitmap_grand_or_12[11:0];&lt;br /&gt;
         hitmap_status_latched[23:12] &amp;lt;= hitmap_grand_or_12_collect[11:0];&lt;br /&gt;
         hitmap_status_latched[24]    &amp;lt;= hitmap_grand_or;&lt;br /&gt;
         hitmap_status_latched[25]    &amp;lt;= hitmap_grand_or_collect;&lt;br /&gt;
         hitmap_status_latched[26]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[27]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[28]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[29]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[30]    &amp;lt;= 0;&lt;br /&gt;
         hitmap_status_latched[31]    &amp;lt;= hitmap_grand_or_stuck;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Register 98, 99 GDM TRIG48 test register and TRIG48_CTRL ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[31:0]  = register_data_in[98][31:0];&lt;br /&gt;
   assign gdm_trig48_ctrl_bitmap48[47:32] = register_data_in[99][15:0];&lt;br /&gt;
&lt;br /&gt;
   assign gdm_trig48_ctrl[15:0]           = register_data_in[99][31:16];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
   wire              enable_grand_or      = trig48_ctrl[15];&lt;br /&gt;
   wire              enable_test_trig48   = trig48_ctrl[14];&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Firmware registers branch develop_ko =&lt;br /&gt;
&lt;br /&gt;
== Register map ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
  0 | ALL | ALL | RO | USR_ACCESSE2 see https://docs.xilinx.com/r/en-US/ug974-vivado-ultrascale-libraries/USR_ACCESSE2&lt;br /&gt;
  1 | ALL | ALL | RW | read write scratch register&lt;br /&gt;
  2 | ALL | CDM | ?? | MGT not used&lt;br /&gt;
  3 | ALL | CDM | RO | MGT debug_data&lt;br /&gt;
  4 | ALL | CDM | RW | clk_config_vec&lt;br /&gt;
  5 | ALL | CDM | ?? | not used&lt;br /&gt;
  6 | ALL | CDM | RO | CDM_link_data_processing:o_error_time&lt;br /&gt;
  7 | ALL | CDM | RO | CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 0 0x80010000 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - gdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - gdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - GDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - GDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - cdm_link_interface:i_mgt_rst&lt;br /&gt;
2 - cdm_link_interface:i_link_down_latched_rst&lt;br /&gt;
8 - CDM_link_data_processing:i_rst&lt;br /&gt;
10..9 - CDM_link_data_processing:i_data_mode&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 1 0x80010004 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:i_rx_slide_trigger&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 2 0x80010008 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - gdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - gdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
nlinks-1..0 - cdm_link_interface:o_link_power_good&lt;br /&gt;
nlinks+15..16 - cdm_link_interface:o_link_status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 3 0x8001000c ==&lt;br /&gt;
&lt;br /&gt;
GDM: simple loopback register&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - debug_data - cdm_link_interface:o_debug&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
o_debug:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rx_link_rst &amp;amp; rx_error &amp;amp; rx_link_up &amp;amp; rx_receiving_data &amp;amp;&lt;br /&gt;
std_logic_vector(rx_state_count) &amp;amp; tx_state_count_on_rx_clk &amp;amp; i_rx_ctrl3(0) &amp;amp;&lt;br /&gt;
i_rx_ctrl1(1 downto 0) &amp;amp; i_rx_ctrl0(1 downto 0) &amp;amp;&lt;br /&gt;
rx_data_is_k28p1_k28p5 &amp;amp;&lt;br /&gt;
i_rx_data;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 4 0x80010010 ==&lt;br /&gt;
&lt;br /&gt;
GDM write:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GDM read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - clk_config_vec(0) - CLK_IN_SEL_LS(0)&lt;br /&gt;
1 - clk_config_vec(1) - CLK_IN_SEL_LS(1)&lt;br /&gt;
2 - clk_config_vec(2) - CLK_EXT_SEL_LS&lt;br /&gt;
3 - clk_config_vec(3) - CLK_RSTn_LS&lt;br /&gt;
4 - clk_config_vec(4) - CLK_LOSXTn_LS&lt;br /&gt;
5 - clk_config_vec(5) - CLK_LOLn_LS&lt;br /&gt;
6 - clk_config_vec(6) - CLK_INTn_LS&lt;br /&gt;
7 - constant 1&lt;br /&gt;
31..8 - constant 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 5 0x80010014 ==&lt;br /&gt;
&lt;br /&gt;
not used&lt;br /&gt;
&lt;br /&gt;
== register 6 0x80010018 ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3..0 - GDM_link_data_processing:i_status_select&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== register 7 0x8001001c ==&lt;br /&gt;
&lt;br /&gt;
GDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - GDM_link_data_processing:o_status_vector&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CDM:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
31..0 - CDM_link_data_processing:o_error_count&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= GDM, CDM, VX packet communications =&lt;br /&gt;
&lt;br /&gt;
* timestamp math&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 clock is 8 ns is 125 MHz&lt;br /&gt;
8 bits of clocks is 256 clocks is 2048 ns is ~2 usec&lt;br /&gt;
16 bits of clocks is ~500 usec is 0.5 msec&lt;br /&gt;
24 bits of clocks is ~134 msec&lt;br /&gt;
32 bits of clocks is ~34 sec&lt;br /&gt;
40 bits of clocks is ~8.7 ksec is 2.4 hours&lt;br /&gt;
48 bits of clocks is ~625 hours is ~26 days&lt;br /&gt;
56 bits of clocks is ~6.6 kdays is ~18 kyears&lt;br /&gt;
62 bits of clocks is ~10 Mhours is 427 kdays is ~1.1 kyears&lt;br /&gt;
64 bits of clocks is ~4.4 kyears&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* summary&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x01 - not used&lt;br /&gt;
0x02 -   8 bytes -  4 words -  2 dwords -  1 qwords - TRG packet&lt;br /&gt;
0x03 -  12 bytes -  6 words -  3 dwords -  2 qwords - TRIG48 packet&lt;br /&gt;
0x10 -  26 bytes - 13 words -  7 dwords -  4 qwords - TSM packet&lt;br /&gt;
0x81 -  10 bytes -  5 words -  3 dwords -  2 qwords - VX_HITMAP packet&lt;br /&gt;
0x82 - 108 bytes - 54 words - 27 dwords - 14 qwords - CDM_HITMAP packet&lt;br /&gt;
0x83 -  12 bytes -  6 words -  3 dwords -  2 qwords - CDM_BUSY packet&lt;br /&gt;
0x84 -  12 bytes -  6 words -  3 dwords -  2 qwords - GDM_BUSY packet&lt;br /&gt;
0x85 -  12 bytes -  6 words -  3 dwords -  1 qwords - GDM_HITMAP packet&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x02 - TRG packet, 8 bytes, 80 adc clocks, 640 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x02&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - trg_in_latch[7:0]&lt;br /&gt;
7 - trg_in_latch[15:8]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x03 - TRIG48 packet, 12 bytes, 120 adc clocks, 960 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x03&lt;br /&gt;
1 - trg_counter[7:0]&lt;br /&gt;
2 - ts64 low byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 high byte 3&lt;br /&gt;
6 - vx_bitmap[7:0]&lt;br /&gt;
7 - vx_bitmap[15:8]&lt;br /&gt;
8 - vx_bitmap[23:16]&lt;br /&gt;
9 - vx_bitmap[31:24]&lt;br /&gt;
10 - vx_bitmap[39:32]&lt;br /&gt;
11 - vx_bitmap[47:40]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x10 - TSM packet, 26 bytes, 260 adc clocks, 2080 ns on lvds link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x10&lt;br /&gt;
1 - tsm_counter[7:0]&lt;br /&gt;
2 - gdm_ts64 low byte 0&lt;br /&gt;
3 - 1&lt;br /&gt;
4 - 2&lt;br /&gt;
5 - 3&lt;br /&gt;
6 - 4&lt;br /&gt;
7 - 5&lt;br /&gt;
8 - 6&lt;br /&gt;
9 - gdm_ts64 high byte 7&lt;br /&gt;
10 - gps_ts64 low byte 0&lt;br /&gt;
11 - 1&lt;br /&gt;
12 - 2&lt;br /&gt;
13 - 3&lt;br /&gt;
14 - 4&lt;br /&gt;
15 - 5&lt;br /&gt;
16 - 6&lt;br /&gt;
17 - gps_ts64 high byte 7&lt;br /&gt;
18 - gps_data64 low byte 0&lt;br /&gt;
19 - 1&lt;br /&gt;
20 - 2&lt;br /&gt;
21 - 3&lt;br /&gt;
22 - 4&lt;br /&gt;
23 - 5&lt;br /&gt;
24 - 6&lt;br /&gt;
25 - gps_data64 high byte 7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x81 - VX hitmap packet, 10 bytes, 100 adc clocks, 800 ns on lvds link, 48 ns on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x81&lt;br /&gt;
1 - VX ID&lt;br /&gt;
2 - hitmap low byte, nits 7:0&lt;br /&gt;
3 - 15:8&lt;br /&gt;
4 - 23:16&lt;br /&gt;
5 - 31:24&lt;br /&gt;
6 - ...:32&lt;br /&gt;
7 - ...&lt;br /&gt;
8 - ...&lt;br /&gt;
9 - hitmap low byte, bits 63:...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x82 - CDM hitmap packet, 108 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x82&lt;br /&gt;
1 - cdm_hitmap_trigger_counter[7:0]&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - cdm_hitmap_or12 byte 0 (7:0)&lt;br /&gt;
11 - cdm_hitmap_or12 byte 1 (11:8) plus 4 bits: 12=0, 13=0, 14=0, 15=cdm_hitmap_grand_or&lt;br /&gt;
12 - cdm_hitmap_data, low byte, 12*64 bits = 768 bits = 48 words = 96 bytes&lt;br /&gt;
...&lt;br /&gt;
107 - cdm_hitmap_data, high byte&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x83 - CDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x83&lt;br /&gt;
1 - cdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - vx_bsy[7:0]&lt;br /&gt;
11 - {0,0,cdm_veto,cdm_bsy,vx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x84 - GDM busy packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x84&lt;br /&gt;
1 - gdm_busy_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - qsfp_rx_bsy[7:0]&lt;br /&gt;
11 - {0,0,gdm_veto,gdm_bsy,qsfp_rx_bsy[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* 0x85 - GDM hitmap trigger packet, 12 bytes, not sent on lvds link, not sent on fiber link&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0 - 0x85&lt;br /&gt;
1 - gdm_hitmap_packet_counter[7:0], reset at begin of run&lt;br /&gt;
2 - ts64 byte 0&lt;br /&gt;
3 - ts64 byte 1&lt;br /&gt;
4 - ts64 byte 2&lt;br /&gt;
5 - ts64 byte 3&lt;br /&gt;
6 - ts64 byte 4&lt;br /&gt;
7 - ts64 byte 5&lt;br /&gt;
8 - ts64 byte 6&lt;br /&gt;
9 - ts64 byte 7&lt;br /&gt;
10 - hitmap_grand_or_12[7:0]&lt;br /&gt;
11 - {hitmap_grand_or,0,0,0,hitmap_grand_or_12[11:8]}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= AXI bus timing =&lt;br /&gt;
&lt;br /&gt;
* AXI 100 MHz clock, 10 ns, 32-bit data&lt;br /&gt;
* AXI single-dword read: 36 clock repeat rate, 360 ns is 2.777 MHz, 4 bytes per transfer is 11.11 Mbytes/sec&lt;br /&gt;
* AXI single-qword read: 13 clock repeat rate, 130 ns is 7.7 MHz, 4 bytes per transfer is 30 Mbytes/sec, not accounting for the gap&lt;br /&gt;
* AXI memcpy read: 4 transfers at 13 clocks, gap, 4 transfers at 13 clocks, gap, etc. below 30 Mbytes/sec.&lt;br /&gt;
[[Image:Ds-dm-axi-read.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-64.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-read-memcpy.png|100px]]&lt;br /&gt;
* AXI single-dword write: 20 clocks repeat rate, 200 ns is 5 MHz, 4 bytes per transfer is 20 Mbytes/sec&lt;br /&gt;
* AXI single-qword write: 13+20 clocks repeat rate, 330 ns is 3 MHz, 16 bytes per burst is 48 Mbytes/sec&lt;br /&gt;
[[Image:Ds-dm-axi-write.png|100px]]&lt;br /&gt;
[[Image:Ds-dm-axi-write-64.png|100px]]&lt;br /&gt;
&lt;br /&gt;
= AXI bus addresses =&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses assigned inthe FPGA project: (s_axi/reg0 is the DS-DM AXI registers)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:ds-dm-gcdm$ grep assign_bd_address scripts/GDM_CDM_XU8_bd.tcl&lt;br /&gt;
  assign_bd_address -offset 0x80010000 -range 0x00004000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs axi_register_interfa_0/s_axi/reg0] -force&lt;br /&gt;
  assign_bd_address -offset 0x000400000000 -range 0x40000000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs ddr4/C0_DDR4_MEMORY_MAP/C0_DDR4_ADDRESS_BLOCK] -force&lt;br /&gt;
  assign_bd_address -offset 0x80000000 -range 0x00010000 -target_address_space [get_bd_addr_spaces zynq_ultra_ps_e/Data] [get_bd_addr_segs system_management_wiz/S_AXI_LITE/Reg] -force&lt;br /&gt;
daq00:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* see AXI/AMBA addresses exported from FPGA project to Linux kernel: (uio for debug bridge should say &amp;quot;debug bridge&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# cat /sys/class/uio/uio*/name&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
axi-pmon&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/&lt;br /&gt;
total 0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio0 -&amp;gt; ../../devices/platform/amba/ffa00000.perf-monitor/uio/uio0&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio1 -&amp;gt; ../../devices/platform/amba/fd0b0000.perf-monitor/uio/uio1&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio2 -&amp;gt; ../../devices/platform/amba/fd490000.perf-monitor/uio/uio2&lt;br /&gt;
lrwxrwxrwx 1 root root 0 Oct 18 01:36 uio3 -&amp;gt; ../../devices/platform/amba/ffa10000.perf-monitor/uio/uio3&lt;br /&gt;
root@gdm0:~# ls -l /sys/class/uio/../../devices/platform/amba/&lt;br /&gt;
total 0&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 19:37 driver_override&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 fd070000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd0b0000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd400000.zynqmp_phy&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd490000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd500000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd510000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd520000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd530000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd540000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd550000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd560000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd570000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 fd6e0000.cci&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff000000.serial&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff020000.i2c&lt;br /&gt;
drwxr-xr-x 6 root root    0 Oct 18 01:36 ff0a0000.gpio&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0b0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0e0000.ethernet&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff0f0000.spi&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff160000.mmc&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ff170000.mmc&lt;br /&gt;
drwxr-xr-x 3 root root    0 Oct 18 01:36 ff960000.memory-controller&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ff9d0000.usb0&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa00000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa10000.perf-monitor&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa50000.ams&lt;br /&gt;
drwxr-xr-x 5 root root    0 Oct 18 01:36 ffa60000.rtc&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa80000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffa90000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaa0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffab0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffac0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffad0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffae0000.dma&lt;br /&gt;
drwxr-xr-x 4 root root    0 Oct 18 01:36 ffaf0000.dma&lt;br /&gt;
-r--r--r-- 1 root root 4096 Oct 18 19:37 modalias&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 19:37 of_node -&amp;gt; ../../../firmware/devicetree/base/amba&lt;br /&gt;
drwxr-xr-x 2 root root    0 Oct 18 19:37 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Oct 18 01:36 subsystem -&amp;gt; ../../../bus/platform&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Oct 18 01:36 uevent&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Build firmware =&lt;br /&gt;
&lt;br /&gt;
== Build from git clone ==&lt;br /&gt;
&lt;br /&gt;
THESE ARE K.O.&#039;s NOTES FOR CREATING THE PETALINUX DIRECTORY.&lt;br /&gt;
&lt;br /&gt;
THEY DO NOT WORK!&lt;br /&gt;
&lt;br /&gt;
COPY PETALINUX FROM A WORKING PROJECT AND USE &amp;quot;make gdm&amp;quot; and &amp;quot;make cdm&amp;quot; AS DESCRIBED BELOW.&lt;br /&gt;
&lt;br /&gt;
* git clone git@edev-group.triumf.ca:fw/exp/darkside/gcdm.git&lt;br /&gt;
* #Makefile change VIVADO_SETTINGS_SCRIPT := /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* #. /opt/Xilinx/Vivado/2022.1/settings64.sh&lt;br /&gt;
* . /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
* make clean&lt;br /&gt;
* make all_from_scratch&lt;br /&gt;
* . /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
* make petalinux_create&lt;br /&gt;
* make petalinux_rebuild_new_hw_des&lt;br /&gt;
* bomb out: The TMPDIR: /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp can&#039;t be located on nfs.&lt;br /&gt;
* mkdir /tmp/build_tmp&lt;br /&gt;
* rm -rf /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp/&lt;br /&gt;
* ln -s /tmp/build_tmp /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/build/tmp&lt;br /&gt;
* try again&lt;br /&gt;
* grinds, loads a whole bunch of packages...&lt;br /&gt;
* finishes with desire to copy things to /tftpboot&lt;br /&gt;
* make sdcard_cp_to wants to copy files from PetaLinux_GDM_CDM/images/linux/ to SD card&lt;br /&gt;
&lt;br /&gt;
== Build firmware ==&lt;br /&gt;
&lt;br /&gt;
NOTE: directory Petalinux_GDM_CDM should already exist!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#. /opt/Xilinx/Vivado/2020.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/Vivado/2022.2/settings64.sh&lt;br /&gt;
. /opt/Xilinx/PetaLinux/2020.2/tool/settings.sh&lt;br /&gt;
make clean_gdm   # remove gdm build tree&lt;br /&gt;
make gdm         # build or rebuild GDM&lt;br /&gt;
make copy_gdm    # copy to gdm0&lt;br /&gt;
make clean_cdm   # remove cdm build tree&lt;br /&gt;
make cdm         # build or rebuild CDM&lt;br /&gt;
make copy_cdm    # copy to cdm0 and cdm1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
copy to SD card:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
open a root shell&lt;br /&gt;
format 16 GB Sd card per above&lt;br /&gt;
cd .../ds-dm-gcdm&lt;br /&gt;
make copy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= build times =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM 12-june-2023 69aabc1c25130d970bc375aca684bd68849e6685&lt;br /&gt;
daq13 AMD-5700G 1688.61user 399.33system 23:28.84elapsed 148%CPU&lt;br /&gt;
dsdaqgw AMD-7700 1090.55user 247.34system 16:03.55elapsed 138%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 196.68user 67.62system 7:35.42elapsed 58%CPU&lt;br /&gt;
dsdaqgw AMD-7700 CDM incremental 684.72user 94.17system 7:30.17elapsed 173%CPU&lt;br /&gt;
dsdaqgw AMD-7700 GDM incremental 849.84user 99.79system 9:04.56elapsed 174%CPU&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= make bootable sd card =&lt;br /&gt;
&lt;br /&gt;
== format the sd card ==&lt;br /&gt;
&lt;br /&gt;
this only needs to be done once&lt;br /&gt;
&lt;br /&gt;
* become root@dsdaqgw&lt;br /&gt;
* cd ~olchansk/git/ds-dm-gcdm&lt;br /&gt;
* use &amp;quot;lsblk&amp;quot; to identify the SD card (should show as 8/16/32 GB block device)/ /dev/sdd in this case&lt;br /&gt;
* make sdcard_format SDCARD_DEVICE=/dev/sdd&lt;br /&gt;
* disconnect sd card, reconnect the sd card (to detect new partition tables, etc)&lt;br /&gt;
&lt;br /&gt;
== copy boot files to the sd card ==&lt;br /&gt;
&lt;br /&gt;
* as root: identify partition labels, run &amp;quot;blkid&amp;quot;, should say &amp;quot;BOOT&amp;quot;, &amp;quot;rootfs&amp;quot; and &amp;quot;data&amp;quot;&lt;br /&gt;
* mount&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir -p /mnt/BOOT&lt;br /&gt;
mount -L BOOT /mnt/BOOT&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/BOOT_{GDM,CDM}.BIN  /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/boot.scr            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/image.ub            /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot.env           /mnt/BOOT/&lt;br /&gt;
cp PetaLinux_GDM_CDM/images/linux/uboot-redund.env    /mnt/BOOT/&lt;br /&gt;
umount /mnt/BOOT&lt;br /&gt;
eject /dev/sdX&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* FIXME: missing step: cp BOOT_GDM.BIN BOOT.BIN or cp BOOT_CDM.BIN BOOT.BIN&lt;br /&gt;
&lt;br /&gt;
= boot messages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Xilinx Zynq MP First Stage Boot Loader &lt;br /&gt;
Release 2020.2   Sep 24 2022  -  13:29:15&lt;br /&gt;
NOTICE:  ATF running on XCZU4CG/silicon v4/RTL5.1 at 0xfffea000&lt;br /&gt;
NOTICE:  BL31: v2.2(release):xlnx_rebase_v2.2_2020.3&lt;br /&gt;
NOTICE:  BL31: Built : 18:02:46, Sep 28 2022&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
U-Boot 2020.01 (Sep 28 2022 - 18:03:39 +0000)&lt;br /&gt;
&lt;br /&gt;
Model: DarkSide 20k DM&lt;br /&gt;
Board: Xilinx ZynqMP&lt;br /&gt;
DRAM:  2 GiB&lt;br /&gt;
usb dr_mode not found&lt;br /&gt;
PMUFW:  v1.1&lt;br /&gt;
EL Level:       EL2&lt;br /&gt;
Chip ID:        zu4&lt;br /&gt;
NAND:  0 MiB&lt;br /&gt;
MMC:   mmc@ff160000: 0, mmc@ff170000: 1&lt;br /&gt;
In:    serial@ff000000&lt;br /&gt;
Out:   serial@ff000000&lt;br /&gt;
Err:   serial@ff000000&lt;br /&gt;
Bootmode: SD_MODE1&lt;br /&gt;
Reset reason:   SOFT &lt;br /&gt;
Net:   &lt;br /&gt;
ZYNQ GEM: ff0b0000, mdio bus ff0b0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
&lt;br /&gt;
Warning: ethernet@ff0b0000 (eth0) using random MAC address - d6:62:5f:13:00:44&lt;br /&gt;
eth0: ethernet@ff0b0000&lt;br /&gt;
ZYNQ GEM: ff0e0000, mdio bus ff0e0000, phyaddr -1, interface rgmii-id&lt;br /&gt;
Could not get PHY for eth1: addr -1&lt;br /&gt;
&lt;br /&gt;
Hit any key to stop autoboot:  0 &lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
CTRL-A Z for help | 115200 8N1 | NOR | Minicom 2.7.1 | VT102 | Online 122:2 | ttyACM0                                       &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from u-boot =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/124682257/U-Boot+FPGA+Driver&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; fpga info&lt;br /&gt;
Xilinx Device&lt;br /&gt;
Descriptor @ 0x000000007fddb2c0&lt;br /&gt;
Family:         ZynqMP PL&lt;br /&gt;
Interface type: csu_dma configuration interface (ZynqMP)&lt;br /&gt;
Device Size:    1 bytes&lt;br /&gt;
Cookie:         0x0 (0)&lt;br /&gt;
Device name:    zu4&lt;br /&gt;
Device Function Table @ 0x000000007fda5fe8&lt;br /&gt;
PCAP status     0xa0002fde&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* cp CDM_XU8_top.bit /tftpboot/fpga.bit&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp&lt;br /&gt;
tftpb 0x10000000 fpga.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; dhcp&lt;br /&gt;
BOOTP broadcast 1&lt;br /&gt;
DHCP client bound to address 192.168.0.100 (1 ms)&lt;br /&gt;
*** Warning: no boot file name; using &#039;C0A80064.img&#039;&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;C0A80064.img&#039;.&lt;br /&gt;
Load address: 0x8000000&lt;br /&gt;
Loading: *&lt;br /&gt;
TFTP error: &#039;file /tftpboot/C0A80064.img not found for 192.168.0.100&#039; (1)&lt;br /&gt;
Not retrying...&lt;br /&gt;
ZynqMP&amp;gt; tftpb 0x10000000 fpga.bit&lt;br /&gt;
Using ethernet@ff0b0000 device&lt;br /&gt;
TFTP from server 192.168.0.1; our IP address is 192.168.0.100&lt;br /&gt;
Filename &#039;fpga.bit&#039;.&lt;br /&gt;
Load address: 0x10000000&lt;br /&gt;
Loading: #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         #################################################################&lt;br /&gt;
         ############&lt;br /&gt;
         6.2 MiB/s&lt;br /&gt;
done&lt;br /&gt;
Bytes transferred = 7797807 (76fc2f hex)&lt;br /&gt;
ZynqMP&amp;gt; fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
  design filename = &amp;quot;CDM_XU8_top;UserID=0XFFFFFFFF;Version=2022.2&amp;quot;&lt;br /&gt;
  part number = &amp;quot;xczu4cg-fbvb900-1-e&amp;quot;&lt;br /&gt;
  date = &amp;quot;2024/08/14&amp;quot;&lt;br /&gt;
  time = &amp;quot;14:18:22&amp;quot;&lt;br /&gt;
  bytes in bitstream = 7797692&lt;br /&gt;
zynqmp_align_dma_buffer: Align buffer at 0000000010000073 to 000000000fffff80(swap 0)&lt;br /&gt;
ZynqMP&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= load FPGA from Linux =&lt;br /&gt;
&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bit /lib/firmware/&lt;br /&gt;
echo fpga.bit &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make .bin file:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bootgen -image CDM_XU8_top.bif -arch zynqmp -o ./fpga.bin -w&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat CDM_XU8_top.bif&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ cat CDM_XU8_top.bif&lt;br /&gt;
all:&lt;br /&gt;
{&lt;br /&gt;
        [destination_device = pl] ./Vivado_CDM_XU8/CDM_XU8.runs/impl_1/CDM_XU8_top.bit&lt;br /&gt;
}&lt;br /&gt;
dsdaqgw:ds-dm-gcdm$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp fpga.bin /lib/firmware/&lt;br /&gt;
echo fpga.bin &amp;gt; /sys/class/fpga_manager/fpga0/firmware&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./fpgautil -b fpga.bin -f Full&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== this will reset the CPU ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DTSO file from here: https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/18841847/Solution+ZynqMP+PL+Programming&lt;br /&gt;
echo 0 &amp;gt; /sys/class/fpga_manager/fpga0/flags&lt;br /&gt;
mount -t configfs configfs /configfs&lt;br /&gt;
root@dsdm:~# dtc -O dtb -o fpga.dtbo -b 0 -@ fpga.dtso&lt;br /&gt;
root@dsdm:~# cp fpga.dtbo /lib/firmware/&lt;br /&gt;
root@dsdm:~# cp fpga.bit /lib/firmware/&lt;br /&gt;
root@dsdm:~# rmdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# mkdir /configfs/device-tree/overlays/fpga&lt;br /&gt;
root@dsdm:~# echo -n &amp;quot;fpga.dtbo&amp;quot; &amp;gt; /configfs/device-tree/overlays/fpga/path &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fpgautil =&lt;br /&gt;
&lt;br /&gt;
* https://github.com/Xilinx/meta-xilinx/blob/master/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/fpgautil.c&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
git clone https://github.com/Xilinx/meta-xilinx.git&lt;br /&gt;
cd meta-xilinx/meta-xilinx-core/recipes-bsp/fpga-manager-script/files/&lt;br /&gt;
scp fpgautil.c root@dsdm:&lt;br /&gt;
ssh root@dsdm&lt;br /&gt;
make fpgautil&lt;br /&gt;
ls -l ./fpgautil&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ls -l ./fpgautil&lt;br /&gt;
-rwxr-xr-x 1 root root 72256 Aug 16 00:15 ./fpgautil&lt;br /&gt;
root@dsdm:~# ./fpgautil &lt;br /&gt;
&lt;br /&gt;
fpgautil: FPGA Utility for Loading/reading PL Configuration&lt;br /&gt;
&lt;br /&gt;
Usage:	fpgautil -b &amp;lt;bin file path&amp;gt; -o &amp;lt;dtbo file path&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Options: -b &amp;lt;binfile&amp;gt;		(Bin file path)&lt;br /&gt;
         -o &amp;lt;dtbofile&amp;gt;		(DTBO file path)&lt;br /&gt;
         -f &amp;lt;flags&amp;gt;		Optional: &amp;lt;Bitstream type flags&amp;gt;&lt;br /&gt;
				   f := &amp;lt;Full | Partial &amp;gt; &lt;br /&gt;
         -n &amp;lt;Fpga region info&amp;gt;  FPGA Regions represent FPGA&#039;s&lt;br /&gt;
                                and partial reconfiguration&lt;br /&gt;
                                regions of FPGA&#039;s in the&lt;br /&gt;
                                Device Tree&lt;br /&gt;
				Default: &amp;lt;full&amp;gt;&lt;br /&gt;
	  -s &amp;lt;secure flags&amp;gt;	Optional: &amp;lt;Secure flags&amp;gt;&lt;br /&gt;
				   s := &amp;lt;AuthDDR | AuthOCM | EnUsrKey | EnDevKey | AuthEnUsrKeyDDR | AuthEnUsrKeyOCM | AuthEnDevKeyDDR | AuthEnDevKeyOCM&amp;gt;&lt;br /&gt;
	  -k &amp;lt;AesKey&amp;gt;		Optional: &amp;lt;AES User Key&amp;gt;&lt;br /&gt;
	  -r &amp;lt;Readback&amp;gt; 	Optional: &amp;lt;file name&amp;gt;&lt;br /&gt;
				Default: By default Read back contents will be stored in readback.bin file&lt;br /&gt;
	  -t			Optional: &amp;lt;Readback Type&amp;gt;&lt;br /&gt;
				   0 - Configuration Register readback&lt;br /&gt;
				   1 - Configuration Data Frames readback&lt;br /&gt;
				Default: 0 (Configuration register readback)&lt;br /&gt;
	  -R 			Optional: Remove overlay from a live tree&lt;br /&gt;
 &lt;br /&gt;
Examples:&lt;br /&gt;
(Load Full bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o can.dtbo -f Full -n full &lt;br /&gt;
(Load Partial bitstream using Overlay)&lt;br /&gt;
fpgautil -b rm0.bit.bin -o rm0.dtbo -f Partial -n PR0&lt;br /&gt;
(Load Full bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full&lt;br /&gt;
(Load Partial bitstream using sysfs interface)&lt;br /&gt;
fpgautil -b rm0.bit.bin -f Partial&lt;br /&gt;
(Load Authenticated bitstream through the sysfs interface)&lt;br /&gt;
fpgautil -b top.bit.bin -f Full -s AuthDDR &lt;br /&gt;
(Load Parital Encrypted Userkey bitstream using Overlay)&lt;br /&gt;
fpgautil -b top.bit.bin -o pl.dtbo -f Partial -s EnUsrKey -k &amp;lt;32byte key value&amp;gt;&lt;br /&gt;
(Read PL Configuration Registers)&lt;br /&gt;
fpgautil -b top.bit.bin -r&lt;br /&gt;
(Remove Partial Overlay)&lt;br /&gt;
fpgautil -R -n PR0&lt;br /&gt;
(Remove Full Overlay)&lt;br /&gt;
fpgautil -R -n full&lt;br /&gt;
Note: fpgautil -R is responsible for only removing the dtbo file from the livetree. it will not remove the PL logic from the FPGA region.&lt;br /&gt;
 &lt;br /&gt;
root@dsdm:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= fw_printenv =&lt;br /&gt;
&lt;br /&gt;
to access u-boot environment from Linux:&lt;br /&gt;
* apt install -y libubootenv-tool&lt;br /&gt;
* create /etc/fw_env.config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/media/BOOT/uboot.env 0 0x40000&lt;br /&gt;
/media/BOOT/uboot-redund.env 0 0x40000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if uboot.env files do not exist, run &amp;quot;saveenv&amp;quot; from u-boot command prompt&lt;br /&gt;
* fw_printenv and fw_setenv should work&lt;br /&gt;
&lt;br /&gt;
= Boot from network =&lt;br /&gt;
&lt;br /&gt;
== u-boot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ZynqMP&amp;gt; setenv bootcmd run bootcmd_dhcp&lt;br /&gt;
ZynqMP&amp;gt; saveenv&lt;br /&gt;
ZynqMP&amp;gt; reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot.scr ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# boot.scr&lt;br /&gt;
# mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
echo Loading FPGA!&lt;br /&gt;
#tftpb 0x10000000 fpga.bit&lt;br /&gt;
tftpb 0x10000000 {ipaddr}.bit&lt;br /&gt;
fpga loadb 0 0x10000000 ${filesize}&lt;br /&gt;
echo Booting Linux!&lt;br /&gt;
run bootcmd_pxe&lt;br /&gt;
echo Done!&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkimage -C none -A arm -T script -d boot.scr boot.scr.uimg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== tftpboot ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /home/olchansk/git/ds-dm-gcdm/boot.scr.uimg /tftpboot&lt;br /&gt;
ln -s /home/olchansk/git/ds-dm-gcdm/PetaLinux_GDM_CDM/images/linux /tftpboot/xilinx-dsdm&lt;br /&gt;
mkdir /tftpboot/pxelinux.cfg&lt;br /&gt;
cat &amp;gt; /tftpboot/pxelinux.cfg/default-arm-zynqmp &amp;lt;&amp;lt;EOF&lt;br /&gt;
LABEL Linux&lt;br /&gt;
   KERNEL xilinx-dsdm/Image&lt;br /&gt;
   FDT xilinx-dsdm/system.dtb&lt;br /&gt;
   #INITRD rootfs.cpio.gz.u-boot&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== boot sequence ==&lt;br /&gt;
&lt;br /&gt;
* xilinx magic load BOOT.BIN from SD card&lt;br /&gt;
* load FPGA form BOOT.BIN&lt;br /&gt;
* load and run u-boot from BOOT.BIN or from image.ub&lt;br /&gt;
* u-boot load environment from ??? probably SD card uboot-redund.env, this includes our bootcmd&lt;br /&gt;
* run bootcmd which run bootcmd_dhcp which does:&lt;br /&gt;
* from /tftpboot:&lt;br /&gt;
* load and run boot.scr.uimg which does:&lt;br /&gt;
* load FPGA image xilinx-dsdm/${ipaddr}.bit&lt;br /&gt;
* run bootcmd_pxe which does:&lt;br /&gt;
* load pxelinux.cfg/default-arm-zynqmp which does:&lt;br /&gt;
* load xilinx-dsdm/Image ### this is the linux kernel&lt;br /&gt;
* load xilinx-dsdm/system.dtb ### this is the device tree&lt;br /&gt;
* start linux kernel&lt;br /&gt;
* linux kernel does dhcp&lt;br /&gt;
* linux kernel does nfs mount /nfsroot/%s,vers=3,tcp ### %s is replaced by the hostname supplied by DHCP&lt;br /&gt;
* userland starts and runs to console and ssh login.&lt;br /&gt;
&lt;br /&gt;
= Xilinx ILA =&lt;br /&gt;
&lt;br /&gt;
References:&lt;br /&gt;
* https://github.com/Xilinx/XilinxVirtualCable/tree/master&lt;br /&gt;
* https://xilinx-wiki.atlassian.net/wiki/spaces/A/pages/644579329/Xilinx+Virtual+Cable&lt;br /&gt;
* https://support.xilinx.com/s/article/974879?language=en_US&lt;br /&gt;
* https://docs.xilinx.com/v/u/en-US/pg245-debug-bridge&lt;br /&gt;
* https://docs.xilinx.com/r/2020.2-English/ug908-vivado-programming-debugging/Initializing-Vivado-IDE-hw_server&lt;br /&gt;
* (we do not use this one) https://github.com/paulscherrerinstitute/xvcSupport/blob/master/README.md&lt;br /&gt;
&lt;br /&gt;
Build xvcserver_cdm.exe: (it is built as a static executable, can be copied and run anywhere)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@gdm0&lt;br /&gt;
cd /home/dsdaq/online/ds-dm-software&lt;br /&gt;
git pull ### get latest version&lt;br /&gt;
make xvcserver_cdm.exe&lt;br /&gt;
ssh root@gdm0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe&lt;br /&gt;
INFO: To connect to this xvcServer instance, use url: TCP:gdm0:2542&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To activate and use the vivado logic analyzer:&lt;br /&gt;
* data path: vivado -&amp;gt; hw_server -&amp;gt; xvcserver -&amp;gt; mmap axi bus -&amp;gt; debug bridge -&amp;gt; jtag -&amp;gt; ILA&lt;br /&gt;
* define ILAs in the code&lt;br /&gt;
* instantiate the xilinx debug bridge at AXI bus address 0x80020000 (FIXME!!! this collides with Ian&#039;s AXI addresses)&lt;br /&gt;
* build and boot the new FPGA firmware. updating the linux kernel is not necessary.&lt;br /&gt;
* login root@gdm0, run: /home/dsdaq/online/ds-dm-software/xvcserver_cdm.exe -v ### with &amp;quot;-v&amp;quot; for the first time to see that vivado does connect to it, without &amp;quot;-v&amp;quot;, normally.&lt;br /&gt;
* login dsdaqgw, run: hw_server -s tcp:localhost:3121 -e &amp;quot;set auto-open-servers xilinx-xvc:gdm0:2542&amp;quot; ### tells us to connect to port localhost:3121&lt;br /&gt;
* login dsdaqgw, run vivado, open project, open hardware manager, open target, open new target, &amp;quot;connect to remote server&amp;quot;, hostname &amp;quot;localhost&amp;quot;, port &amp;quot;3121&amp;quot;, next (bombs, try again, 3 times), popup add virtual cable, enter hostname &amp;quot;gdm0&amp;quot; port &amp;quot;2542&amp;quot;, &amp;quot;ok&amp;quot;, it shows in &amp;quot;hardware targets&amp;quot;, &amp;quot;next&amp;quot;, &amp;quot;finish&amp;quot;, error popup &amp;quot;[Common 17-163] Missing value for option &#039;objects&#039;, please type &#039;set_property -help&#039; for usage info&amp;quot;, ignore it, in &amp;quot;hardware&amp;quot;, right click the &amp;quot;gdm0&amp;quot; one, open target, under &amp;quot;hardware&amp;quot; and &amp;quot;debug bridge&amp;quot; we should see all the ILAs, under &amp;quot;hardware device properties&amp;quot;, the &amp;quot;probes file&amp;quot; should have the &amp;quot;.ltx&amp;quot; file generated by vivado &amp;quot;Vivado_GDM_XU8/GDM_XU8.runs/impl_1/debug_nets.ltx&amp;quot;, click on an ILA, a waveform should open.&lt;br /&gt;
&lt;br /&gt;
= Software =&lt;br /&gt;
&lt;br /&gt;
* ssh cdm0 # or gdm0&lt;br /&gt;
* sudo apt install i2c-tools libi2c-dev&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/ds-dm-software&lt;br /&gt;
* cd ds-dm-software&lt;br /&gt;
* make&lt;br /&gt;
&lt;br /&gt;
== test_cdm.exe ==&lt;br /&gt;
&lt;br /&gt;
=== CDM SFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0xbb2f0ae7&lt;br /&gt;
CDM firmware 0xbb2f0ae7&lt;br /&gt;
arg 1: [--sfp]&lt;br /&gt;
Polling SFP status...&lt;br /&gt;
identifier 0x03&lt;br /&gt;
connector  0x07&lt;br /&gt;
encoding   0x01&lt;br /&gt;
wavelength 0x0352 (850 nm)&lt;br /&gt;
vendor_name [FINISAR CORP.   ]&lt;br /&gt;
vendor_pn   [FTLF8526P3BNL   ]&lt;br /&gt;
vendor_rev  [A   ]&lt;br /&gt;
vendor_sn   [N3AB9M8         ]&lt;br /&gt;
vendor_date [200319  ]&lt;br /&gt;
dm_type    0x68&lt;br /&gt;
temp 29.0 C&lt;br /&gt;
vcc  3.323 V&lt;br /&gt;
tx_bias  7.250 mA&lt;br /&gt;
tx_power 478.4 uW&lt;br /&gt;
rx_power 2.3 uW&lt;br /&gt;
SFP good 1, status: temp 30.6 C, tx_bias 7.4 mA, tx_power 476 uW, rx_power 818 uW&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM QSFP status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --qsfp3 --qsfp&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x53aee418&lt;br /&gt;
CDM firmware 0x53aee418&lt;br /&gt;
arg 1: [--qsfp3]&lt;br /&gt;
gpiochip0: GPIOs 338-511, parent: platform/ff0a0000.gpio, zynqmp_gpio:&lt;br /&gt;
 gpio-378 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-379 (                    |sysfs               ) out hi &lt;br /&gt;
 gpio-381 (                    |sysfs               ) out lo &lt;br /&gt;
 gpio-382 (                    |sysfs               ) out hi &lt;br /&gt;
arg 2: [--qsfp]&lt;br /&gt;
Polling QSFP status...&lt;br /&gt;
identifier 0x0d&lt;br /&gt;
status     0x02&lt;br /&gt;
los        0x8f&lt;br /&gt;
temp       28.2 C&lt;br /&gt;
vcc        3.323 V&lt;br /&gt;
rx_power     0.1   0.1   0.1   0.1 uW&lt;br /&gt;
tx_bias      7.6   7.6   7.6   0.0 mA&lt;br /&gt;
tx_power   792.2 773.8 823.0   0.1 uW&lt;br /&gt;
vendor_name [FINISAR CORP    ]&lt;br /&gt;
vendor_pn   [FTL410QD4C      ]&lt;br /&gt;
vendor_rev  [A ]&lt;br /&gt;
wavelength  850&lt;br /&gt;
max_temp    70 C&lt;br /&gt;
vendor_sn   [X79AC0R         ]&lt;br /&gt;
vendor_date [220309  ]&lt;br /&gt;
QSFP good 1, status: temp 27.7 C, los 0x8b, tx_bias 7.5 7.6 7.6 0.0 mA, tx_power 792 772 821   0 uW, rx_power   0   0 466   0 uW&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x09 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x1f7caf52 (528265042) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip good (IN0 - external 10 MHz clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x00&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a3b (125000251) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a3c (125000252) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM clock status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip not loaded, not running:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x0f 0x16 0x04 0x00 0x01 0x68 0x19 0x00 0x02 0xf2 0x00 0x1f 0xf0 0x22 0xf2, 0x507: 0x00, 0x52A: 0x00, 0x53F: 0x04&lt;br /&gt;
Clock chip state 0, status:  SYSINCAL XAXB_ERR LOL CAL_PLL IN0 IN_SEL_0 FASTLOCK_STATUS&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735851 (124999761) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x0127fefa (19398394) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x00000000 (0) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses internal clock (IN1 - internal oscillator), observe rx_clk frequency is not same as others&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0x7f, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebec9&lt;br /&gt;
CDM firmware 0x6d2ebec9&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b0a (125000458) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735853 (124999763) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735852 (124999762) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* clock chip uses SFP recovered clock (IN2 - sfp rx recovered clock), observe mgt_rx_ref_clk_raw (CDM 125 MHz oscillator) is different from others (SFP RX recovered clock)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
^C&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x0773581b (124999707) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735ad7 (125000407) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735ad6 (125000406) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
^C&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber disconnected, no link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x00000031&lt;br /&gt;
    CLK_IN_SEL_LS   0x1&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x00000025&lt;br /&gt;
    sfp_mod_absent_N       1&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             0&lt;br /&gt;
    rx_receiving_data      0&lt;br /&gt;
    rx_error               1&lt;br /&gt;
    rx_lnk_up_and_running  0&lt;br /&gt;
    tx_link_up             0&lt;br /&gt;
    tx_sending_data        0&lt;br /&gt;
    tx_link_up_and_running 0&lt;br /&gt;
    link_up_and_running    0&lt;br /&gt;
0x1014 SFP link data:   0x466a8187&lt;br /&gt;
    rx_data     0x8187&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x1&lt;br /&gt;
    rx_ctrl1    0x1&lt;br /&gt;
    rx_ctrl3    0x1&lt;br /&gt;
    tx_state    0x1&lt;br /&gt;
    rx_state    0x6&lt;br /&gt;
    rx_receiving_data 0&lt;br /&gt;
    rx_link_up        0&lt;br /&gt;
    rx_error          1&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00079093, errors: 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fiber connected, good link:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM firmware:    0xbb2f0ae7&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c02774&lt;br /&gt;
    rx_data     0x2774&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x0&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000200, seconds: 0x00078a8c, errors: 0x00000000&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status, PRBS test mode ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1 link connected, no errors:&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
GDM firmware:    0x6b2ee010&lt;br /&gt;
0x1014: 0x00000008, 18: 0x00000008, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000200, time: 0x00078aa4, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0x00000000 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== CDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x00 0x00 0xd0 0x01 0x1f 0xfe 0x22 0xf2, 0x507: 0xbf, 0x52A: 0x02, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  IN2 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077357a0 (124999584) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a5c (125000284) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a5b (125000283) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
CDM firmware:    0x6d2ef81a&lt;br /&gt;
0x1000 SFP c.c. status: 0x000000b2&lt;br /&gt;
    CLK_IN_SEL_LS   0x2&lt;br /&gt;
    CLK_EXT_SEL_LS  0&lt;br /&gt;
    CLK_CLK_RSTn_LS 0&lt;br /&gt;
    CLK_LOSXTn_LS   1&lt;br /&gt;
    CLK_LOLn_LS     1&lt;br /&gt;
    CLK_INTn_LS     0&lt;br /&gt;
0x1008 SFP link reset:  0x00000000&lt;br /&gt;
0x1010 SFP link status: 0x000007dc&lt;br /&gt;
    sfp_mod_absent_N       0&lt;br /&gt;
    sfp_rx_los_N           0&lt;br /&gt;
    link_power_good        1&lt;br /&gt;
    rx_link_up             1&lt;br /&gt;
    rx_receiving_data      1&lt;br /&gt;
    rx_error               0&lt;br /&gt;
    rx_lnk_up_and_running  1&lt;br /&gt;
    tx_link_up             1&lt;br /&gt;
    tx_sending_data        1&lt;br /&gt;
    tx_link_up_and_running 1&lt;br /&gt;
    link_up_and_running    1&lt;br /&gt;
0x1014 SFP link data:   0x35c6bcbc&lt;br /&gt;
    rx_data     0xbcbc&lt;br /&gt;
    k28p1_k28p5 0&lt;br /&gt;
    rx_ctrl0    0x3&lt;br /&gt;
    rx_ctrl1    0x0&lt;br /&gt;
    rx_ctrl3    0x0&lt;br /&gt;
    tx_state    0x3&lt;br /&gt;
    rx_state    0x5&lt;br /&gt;
    rx_receiving_data 1&lt;br /&gt;
    rx_link_up        1&lt;br /&gt;
    rx_error          0&lt;br /&gt;
    rx_link_rst       0&lt;br /&gt;
0x2000 link test mode: 0x00000000, seconds: 0x00001671, errors: 0xffffffff&lt;br /&gt;
&lt;br /&gt;
root@cdm1:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 15&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ef81a&lt;br /&gt;
CDM firmware 0x6d2ef81a&lt;br /&gt;
reg[15] is 0x0033bcbc (3390652)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== GDM link status ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test0&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --cc&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip registers: 0x06 0x00 0x94 0x53 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x68 0x00 0x44 0x00 0xd0 0x01 0x1f 0xff 0x22 0xf2, 0x507: 0x3f, 0x52A: 0x01, 0x53F: 0x02&lt;br /&gt;
Clock chip state 1, status:  LOS_IN2 OOF_IN2 IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735a0a (125000202) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&lt;br /&gt;
register 0x1018 bit 0x800&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
GDM firmware:    0x6d2ebce6&lt;br /&gt;
0x1014: 0x00000800, 18: 0x00000800, 1C: 0x00000000, 24: 0x00000fff&lt;br /&gt;
0x2000: 0x00000000, time: 0x00003d2f, errors:&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
0xffffffff 0xffffffff 0xffffffff&lt;br /&gt;
&lt;br /&gt;
link data alternates 0xbcbc and 0x1cbc&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0xbcbc93ab (-1128492117)&lt;br /&gt;
&lt;br /&gt;
root@gdm0:~# /home/dsdaq/online/ds-dm-software/test_cdm.exe 22&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware revision 0x6d2ebce6&lt;br /&gt;
CDM firmware 0x6d2ebce6&lt;br /&gt;
reg[22] is 0x1cbc1aaf (482089647)&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run trg and tsm ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@gdm00&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --gdm-clocks&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 $ # LEMO out is trg_in_pulse&lt;br /&gt;
./test_cdm.exe --writereg 9 0x32010 # trg and tsm from trg_pulser and tsm_pulse&lt;br /&gt;
./test_cdm.exe --writereg 24 1250000 # trg pulser 100 Hz&lt;br /&gt;
./test_cdm.exe --writereg 26 125000000 # tsm pulser 1 Hz&lt;br /&gt;
./test_cdm.exe --writereg 23 0x40000000 # route trg_in and tsm_in to qsfp tx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
ssh root@cdm01&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --load-cc&lt;br /&gt;
./test_cdm.exe --reset-mgt&lt;br /&gt;
./test_cdm.exe --cdm-clocks&lt;br /&gt;
./test_cdm.exe --cdm-link # issue --reset-mgt on CDM and GDM until link is good&lt;br /&gt;
./test_cdm.exe --writereg 2 0xff # enable LEMO NIM inputs&lt;br /&gt;
./test_cdm.exe --writereg 3 0xba54 # enable LEDs: lemo1, lemo2, trg, tsm&lt;br /&gt;
./test_cdm.exe --writereg 4 0x99 # enable LEMO output trg_in&lt;br /&gt;
./test_cdm.exe --writereg 9 0x8040 # enable trg_in and tsm_in from sfp rx bits 0 and 1&lt;br /&gt;
./test_cdm.exe --writereg 7 0xff00 # drive VX LVDS lines to logic level 0&lt;br /&gt;
./test_cdm.exe --writereg 8 0x2 # VX LVDS with trg and tsm, misrouted in second VX&lt;br /&gt;
#./test_cdm.exe --writereg 8 0x7 # VX LVDS with tsm&lt;br /&gt;
./test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
switch GDM and CDM to packetizer trg and tsm:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x00000000&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0804&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --counters # observe counters are counting at 100 Hz and 1 Hz&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Run packet loopback ===&lt;br /&gt;
&lt;br /&gt;
GDM CPU -&amp;gt; fifo_to_fpga -&amp;gt; GDM QSFP -&amp;gt; CDM SFP -&amp;gt; fifo_from_fpga -&amp;gt; CDM CPU&lt;br /&gt;
&lt;br /&gt;
On the GDM: (CDM is connected to first QSFP port)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 32 1 ### tell GDM to use first QSFP port&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --gdm-link ### confirm link status is &amp;quot;3&amp;quot;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 2 ### enable GDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-write-loop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
One the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --load-cc&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --reset-mgt&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 29 3 ### enable CDM packet data injection&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --test-fifo-read&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== fecdm ==&lt;br /&gt;
&lt;br /&gt;
=== Power up and clock management ===&lt;br /&gt;
&lt;br /&gt;
* Clock power up and setup management is handled by fecdm state machine&lt;br /&gt;
* GDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- on GDM frontend start (in HandleInit()), CC is loaded and reset&lt;br /&gt;
- CC will lock to IN0 (10 MHz external clock) or IN1 (125 MHz internal oscillator)&lt;br /&gt;
- if locked to IN0, CC will enter and exit the HOLDOVER mode if 10 MHz clock is unstable&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* CDM clock setup sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
- on power up, CC is not initialized, XAXB clock is not running&lt;br /&gt;
- fecdm detects this, loads the CC configuration registers, resets the CC&lt;br /&gt;
- sets the CC input IN1, DSDM internal oscillator&lt;br /&gt;
- if SFP is in good state, SFP MGT is running, CC is happy with IN2 input (no IN2_OOF, IN2_LOS), SFP recpvered clock (clk_rx_mgt) frequency is close to 125 MHz:&lt;br /&gt;
- switches CC to input IN2 (SFP recovered clock, clk_rx_mgt)&lt;br /&gt;
- waits for CC locked to IN2 (no LOL, no HOLD). (this provides stable SFP tx clock).&lt;br /&gt;
- resets the SFP MGT, requests GDM MGT reset (via ODB)&lt;br /&gt;
- MGT reset sequence: GDM MGT reset 1, CDMnn MGT reset 1, GDM MGT reset 0, CDM MGT reset 0&lt;br /&gt;
- CDM MGT rx_state cycles from 0 to 5. if it goes to 6 or never reaches 5, GDM MGT reset is requested again.&lt;br /&gt;
- during this sequence, clk_rx_mgt may wobble, CC may enter HOLDOVER mode, VX clock should stay steady.&lt;br /&gt;
- once CC is locked to IN2, SFP MGT rx_state is 5, link is ready for use.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Request changes for Ian&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
17 Apr 2025:&lt;br /&gt;
- CDM SFP MGT rx_state is getting stuck in 4 (waiting for alternating idle chars), do we need this? go to state 5 without waiting?&lt;br /&gt;
- GDM QSFP MGT reset 1 does not seem to do anything, change it to cause all CDM MGTs to enter an error state, e.g. start transmitting invalid K-codes. transmitting all 0 or all 1 will break the recovered clock, so maybe do not do that.&lt;br /&gt;
- having all CDM SFP MGTs go to error state immediatley after GDM QSFT MGT reset 1 will greatly simplify the link reset sequence.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Trigger configuration ===&lt;br /&gt;
&lt;br /&gt;
* GDM&lt;br /&gt;
* CDM in SFP trigger mode:&lt;br /&gt;
** SFP K-code encoded sfp_rx_trg, sfp_rx_tsm are routed to LVDS vx_tx_trg and vx_tx_tsm&lt;br /&gt;
** GDM TRG, TSM (and all other) packets are routed to LVDS serial data to VX&lt;br /&gt;
** to make counters count and lights blink:&lt;br /&gt;
** CDM TRG and TSM trigger mask is set to sfp_rx_trg, sfp_rx_tsm and vx_tx_trg_done, vx_tx_tsm_done&lt;br /&gt;
** CDM LEDs display trg_in_pulse, tsm_in_pulse&lt;br /&gt;
** output of TRG and TSM packets is disabled (they come from the GDM)&lt;br /&gt;
&lt;br /&gt;
= dsvslice integration =&lt;br /&gt;
&lt;br /&gt;
== VX setup ==&lt;br /&gt;
&lt;br /&gt;
* general&lt;br /&gt;
** Start acq from user code = y, all others = n (as of Mar 2023: will start when first trigger received)&lt;br /&gt;
** Use NIM IO = y&lt;br /&gt;
** Use external clock = y&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from front panel NIM:&lt;br /&gt;
** Trigger on external signal = y, all others = n&lt;br /&gt;
** connect CDM EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;Sync&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS Sync signal = y, all others = n&lt;br /&gt;
** LVDS quartet mode = User, Sync, User, User&lt;br /&gt;
&lt;br /&gt;
* trigger from LVDS &amp;quot;User&amp;quot; mode&lt;br /&gt;
** Trigger on LVDS pair 12 signal = y, all others = n&lt;br /&gt;
** LVDS quartet is input = n, y, n, y&lt;br /&gt;
** LVDS quartet mode = User, User, User, User&lt;br /&gt;
&lt;br /&gt;
== GDM setup ==&lt;br /&gt;
&lt;br /&gt;
* GDM is gdm0&lt;br /&gt;
* set inputs to NIM mode&lt;br /&gt;
* set outputs to TTL mode (this GDM has wrong NIM output circuit)&lt;br /&gt;
* use top QSFP slot, connect split cable 1 into CDM01, cable 2 into CDM02&lt;br /&gt;
* connect non-inverted NIM trigger signal to top-LEMO-left EXT_IN_LV(1)&lt;br /&gt;
* connect non-inverted NIM TSM signal to top-LEME-right EXT_IN_LV(2)&lt;br /&gt;
* GDM LEDs: TRIG, TSM, trigger enabled, trigger_out&lt;br /&gt;
* GDM LEMO_OUT: trigger, trigger&lt;br /&gt;
&lt;br /&gt;
== CDM setup ==&lt;br /&gt;
&lt;br /&gt;
* set CDM LEMO inputs to NIM&lt;br /&gt;
* set CDM LEMO outputs to NIM&lt;br /&gt;
* CDM01 is cdm0&lt;br /&gt;
* CDM02 is cdm1&lt;br /&gt;
* connect GDM fiber links to SFP port&lt;br /&gt;
* connect 1st VX port of CDM01 to VX1&lt;br /&gt;
* connect 1st VX port of CDM02 to VX2&lt;br /&gt;
* connect LEMO EXT_OUT(2) to VX &amp;quot;TrigIn&amp;quot;, CDM01 to VX1, CDM02 to VX2&lt;br /&gt;
* power up&lt;br /&gt;
* CDM LEDs: GDM TRIG, GDM TSM, trigger enabled, trigger out&lt;br /&gt;
* CDM LEMO_OUT: gdm_trg, trigger&lt;br /&gt;
&lt;br /&gt;
== After power up ==&lt;br /&gt;
&lt;br /&gt;
* start the CDM frontend from the MIDAS &amp;quot;Programs&amp;quot; page. To start manually, see the Start Command on the Programs page.&lt;br /&gt;
* CDM frontend should enable the VX clock, disable the trigger&lt;br /&gt;
* from the MIDAS status page, goto the CDM page&lt;br /&gt;
* outdated: in the CDMx data tables, the 2nd number should read 0x35c08008, if it does not and the last 4 digits randomly change, reset the GDM links&lt;br /&gt;
*if the FEs complain - do in order: for GDM, CDM01, CDM02, ..., press &amp;quot;reset mgt&amp;quot; of each board, then press &amp;quot;unreset mgt&amp;quot;, if it does not help, STOP HERE&lt;br /&gt;
* start a run&lt;br /&gt;
* CDM frontend will enable the trigger&lt;br /&gt;
* GDM frontend will enable the trigger&lt;br /&gt;
* LEDs on the GDM should flash, LEDs on the CDM should flash, TrigIn and TrigOut of the VX should flash&lt;br /&gt;
* stop a run&lt;br /&gt;
* GDM frontend will disable the trigger&lt;br /&gt;
* CDM frontend will disable the trigger&lt;br /&gt;
&lt;br /&gt;
== Phase measurement ==&lt;br /&gt;
&lt;br /&gt;
* pip3 install matplotlib&lt;br /&gt;
* pip3 install scipy&lt;br /&gt;
* export PYTHONPATH=$HOME/packages/midas/python&lt;br /&gt;
* #git clone https://github.com/J033X071C/PhaseMeasurement&lt;br /&gt;
* git clone https://bitbucket.org/team-ds-dm/phasemeasurement.git&lt;br /&gt;
* cd phasemeasurement&lt;br /&gt;
* python3 ./phaseMeasurement.py --help&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:PhaseMeasurement$ python3 ./phaseMeasurement.py --help&lt;br /&gt;
usage: phaseMeasurement.py [-h] fileName numberEvents numberVX sizeEvents stopEvent minHist maxHist numberBin writeToTXT saveAsPDF&lt;br /&gt;
&lt;br /&gt;
Read data from midas file (in .lz4 format) to calculate phase between the clock of VX1 and VX2&lt;br /&gt;
&lt;br /&gt;
positional arguments:&lt;br /&gt;
  fileName      Name of the file we want to read data from (Example: run00389.mid.lz4)&lt;br /&gt;
  numberEvents  Number of events recorded in the file&lt;br /&gt;
  numberVX      Number of VX used in this run (usually 2...)&lt;br /&gt;
  sizeEvents    Number of points per event&lt;br /&gt;
  stopEvent     Number of events you want to go through to calculate phase&lt;br /&gt;
  minHist       Minimal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  maxHist       Maximal value for the x axis of the phase measurement histogram (in ns)&lt;br /&gt;
  numberBin     Number of bins wanted for the generated histogram&lt;br /&gt;
  writeToTXT    Write argument as yes to generate text file with results of calculation&lt;br /&gt;
  saveAsPDF     Save generated plots to PDF files&lt;br /&gt;
&lt;br /&gt;
optional arguments:&lt;br /&gt;
  -h, --help    show this help message and exit&lt;br /&gt;
daq00:PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try an old file with &lt;br /&gt;
* python3 ./phaseMeasurement.py run00877.mid.lz4 10000 2 10000 500 -20 20 81 yes yes&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
bin size = 0.494 ns&lt;br /&gt;
num_events =  347&lt;br /&gt;
mean = -1.705 ns&lt;br /&gt;
rms = 3.087 ns&lt;br /&gt;
mean_error = 0.166 ns&lt;br /&gt;
centroid = -1.706 ns.&lt;br /&gt;
width (sigma) = 0.363 ns.&lt;br /&gt;
error on the centroid = 0.016558 ns.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ls -l *.txt *.pdf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ ls -l *.txt *.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq 64728 Dec 14 16:56 run00877.mid.lz4_Plots.pdf&lt;br /&gt;
-rw-rw-r-- 1 dsdaq dsdaq   274 Dec 14 16:56 run00877.mid.lz4.txt&lt;br /&gt;
dsdaq@dsvslice:~/online/PhaseMeasurement$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* scope settings (from email message)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From fcote-lortie@triumf.ca  Thu Dec 15 17:11:46 2022&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
Date: Fri, 16 Dec 2022 01:11:44 +0000&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display) by pressing on the button. It will go from 0 to 1.&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie &amp;lt;fcote-lortie@triumf.ca&amp;gt;&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:58 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: Re: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&lt;br /&gt;
     The settings that we are using right now are:&lt;br /&gt;
      Type of waveform: Sine wave&lt;br /&gt;
      Offset: 0 V&lt;br /&gt;
      Amplitude: 1 Vpp&lt;br /&gt;
      Frequency: 50 kHz&lt;br /&gt;
      Noise: 0 V&lt;br /&gt;
________________________________&lt;br /&gt;
From: Francis Cote-Lortie&lt;br /&gt;
Sent: Thursday, December 15, 2022 4:54 PM&lt;br /&gt;
To: Konstantin Olchanski &amp;lt;olchansk@triumf.ca&amp;gt;&lt;br /&gt;
Subject: How to use scope as a waveform generator&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
  1.  Turn the power on (bottom left of the scope)&lt;br /&gt;
  2.  Access the waveform generator display by pressing the Gen button (bottom right of the scope)&lt;br /&gt;
  3.  The waveform generator display allows you to choose wave type (sine, square, etc.), frequency, amplitude, offset, etc. The display is a touch screen. Make the&lt;br /&gt;
waveform you want by using the different options.&lt;br /&gt;
  4.  Turn the output on (first option on the display)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Standalone link test ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
CDM: program clock chip&lt;br /&gt;
busybox devmem 0x80011000 32 0x8&lt;br /&gt;
busybox devmem 0x80011000 32 0x0&lt;br /&gt;
/home/dsdaq/si5394-i2c-file CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt  0 0x6b&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: link reset&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
&lt;br /&gt;
GDM, CDM: release reset&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
&lt;br /&gt;
CDM: link status (NOTE: SFP LOS and mod_absent are swapped!!!)&lt;br /&gt;
busybox devmem 0x80011010 32&lt;br /&gt;
0x00000024 &amp;lt;- fiber plugged&lt;br /&gt;
0x00000025 &amp;lt;- fiber unplugged&lt;br /&gt;
0x00000027 &amp;lt;- SFP unplugged&lt;br /&gt;
0x000007DC &amp;lt;- successful link with GDM&lt;br /&gt;
&lt;br /&gt;
CDM: link state machine and data&lt;br /&gt;
busybox devmem 0x80011014 32&lt;br /&gt;
0x35C06FF6&lt;br /&gt;
&lt;br /&gt;
CDM: set link to counting mode&lt;br /&gt;
busybox devmem 0x80012000 32 0x101&lt;br /&gt;
busybox devmem 0x80012000 32 0x100&lt;br /&gt;
&lt;br /&gt;
CDM: time counter and error counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012000 32&lt;br /&gt;
0x00000100 &amp;lt;--- link mode&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058C &amp;lt;--- seconds counter&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012004 32&lt;br /&gt;
0x0000058D&lt;br /&gt;
root@cdm1:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x00000000 &amp;lt;--- error counter&lt;br /&gt;
&lt;br /&gt;
GDM: no link&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011014 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011018 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001101c 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80011024 32&lt;br /&gt;
0x00000FFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&lt;br /&gt;
GDM: good link channel 10, counting mode&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x101&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012000 32 0x100&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x3A8B68C2&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012008 32&lt;br /&gt;
0x42E03BEF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDA090972&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001200c 32&lt;br /&gt;
0xDE6F22E9&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012019 32&lt;br /&gt;
Bus error&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012010 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012014 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012018 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001201c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012020 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012024 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012028 32&lt;br /&gt;
0x00000000&lt;br /&gt;
root@gdm0:~# busybox devmem 0x8001202c 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012030 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# busybox devmem 0x80012034 32&lt;br /&gt;
0xFFFFFFFF&lt;br /&gt;
root@gdm0:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
mapping of link channels:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
qsfp0 lane0 - 0x0100 - link 8&lt;br /&gt;
qsfp0 lane1 - 0x0200 - link 9&lt;br /&gt;
qsfp0 lane2 - 0x0400 - link 10&lt;br /&gt;
qsfp0 lane3 - n/c&lt;br /&gt;
qsfp1 lane0 - 0x0800 - link 11&lt;br /&gt;
qsfp1 lane1 - 0x0010 - link 4&lt;br /&gt;
qsfp1 lane2 - 0x0020 - link 5&lt;br /&gt;
qsfp1 lane3 - n/c&lt;br /&gt;
qsfp2 lane0 - 0x0040 - link 6&lt;br /&gt;
qsfp2 lane1 - 0x0080 - link 7&lt;br /&gt;
qsfp2 lane2 - 0x0001 - link 0&lt;br /&gt;
qsfp2 lane3 - n/c&lt;br /&gt;
qsfp3 lane0 - 0x0002 - link 1&lt;br /&gt;
qsfp3 lane1 - 0x0004 - link 2&lt;br /&gt;
qsfp3 lane2 - 0x0008 - link 3&lt;br /&gt;
qsfp3 lane3 - n/c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
script to start the test with 2 CDMs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh dsdaq@dsvslice&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 1&lt;br /&gt;
ssh root@gdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm1 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@cdm0 busybox devmem 0x80011008 32 0&lt;br /&gt;
ssh root@gdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm0 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
ssh root@cdm1 /home/dsdaq/online/ds-dm-software/test_cdm.exe --link-test2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== LEMO trigger GDM to CDM to VX ==&lt;br /&gt;
&lt;br /&gt;
on the GDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/GDM_v1.0_IN0_EXT1_and_IN1_fixed_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
busybox devmem 0x80011008 32 0x1&lt;br /&gt;
busybox devmem 0x80011008 32 0x0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x80001230 # QSFP TX fixed pattern&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 2 0xff # enable LEMO inputs&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 3 0x7654 # enable LED, one per LEMO input&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x0F0F # enable LEMO to trg_in and tsm_in&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 23 0x40001230 # enable trg_in and tsm_in output to QSFP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the CDM:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/home/dsdaq/si5394-i2c-file /home/dsdaq/CDM_v3.0_IN1_fixed_and_IN2_RX_Recovered_VX_62.5MHz_Si5394-RevA-Registers.txt 0 0x6b&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-clocks&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --sfp&lt;br /&gt;
busybox devmem 0x80011008 32 1&lt;br /&gt;
busybox devmem 0x80011008 32 0&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --cdm-link&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe --writereg 9 0x8040 # trg_in from sfp[0], tsm_in form sfp[1]&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 11 # trg_in counter&lt;br /&gt;
/home/dsdaq/online/ds-dm-software/test_cdm.exe 12 # tsm_in counter&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== GPS receiver VCL-2705 ==&lt;br /&gt;
&lt;br /&gt;
* Valiant VCL-2705 GPS receiver&lt;br /&gt;
* https://www.valiantcom.com/time-distribution/gps-receiver-irig-b.html&lt;br /&gt;
* USB connection is /dev/ttyACM0, 115200 bps, &amp;quot;GNSSAUX&amp;quot; prompt&lt;br /&gt;
* minicom -D /dev/ttyACM0 -b 115200&lt;br /&gt;
* user manual download instructoins - see sheet of paper with user name and password in the shipping box&lt;br /&gt;
* usb commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gnss-help&lt;br /&gt;
gnss-showver -&amp;gt; F/W: Ver 1.7 Feb 17 2020 16:20:43&lt;br /&gt;
&lt;br /&gt;
gnss-showselftest -&amp;gt; no antenna connected&lt;br /&gt;
Overall   : FAIL&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : NOT DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
gnss-showsettings&lt;br /&gt;
GNSS NMEA BAUDRATE        :115200&lt;br /&gt;
GNSS ANTENNA LENGTH       :30 meters&lt;br /&gt;
GNSS USER CONFIGURED DELAY:-65 nanoseconds&lt;br /&gt;
GNSS 1PPS PULSE WIDTH     :200 milliseconds&lt;br /&gt;
GNSS MODE                 :GPS&lt;br /&gt;
GNSS STATUS               :STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showserial&lt;br /&gt;
SERIAL :2704H01V17MAX310&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmode&lt;br /&gt;
GNSS MODE : GPS&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showstatus&lt;br /&gt;
GNSS STATUS: STATIONARY&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : NOT DETECTED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : **NOT DETECTED&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Secs 0&lt;br /&gt;
RMC BAD DURATION   : Secs 0&lt;br /&gt;
LOCK GOOD SECS DURATION  : Secs 0&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 0&lt;br /&gt;
SATINFO GOOD ITERATIONS   :0&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-1 HUNTING ANTENNA DETECT&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 0&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate &lt;br /&gt;
GNSS RECEIVER ANTENNA Not Detected !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showjamstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showspoofstatus&lt;br /&gt;
Not Available !&lt;br /&gt;
&lt;br /&gt;
--- antenna connected, can see the sky ---&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showselftest&lt;br /&gt;
Overall   : PASS&lt;br /&gt;
EPROM Test: PASS&lt;br /&gt;
Antenna   : DETECTED&lt;br /&gt;
GNSS      : COMMUNICATION OK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showalarms&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA   : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showerrors&lt;br /&gt;
CURRENT ALARMS GNSS&lt;br /&gt;
ANTENNA : DETECTED&lt;br /&gt;
GNSS LOCK : AVAILABLE&lt;br /&gt;
ERROR STATISTICS GNSS&lt;br /&gt;
RMC GOOD DURATION  : Mins 1,Secs 34&lt;br /&gt;
RMC BAD DURATION   : Secs 55&lt;br /&gt;
LOCK GOOD SECS DURATION  : Mins 1,Secs 34&lt;br /&gt;
LOCK BAD SECS DURATION   : Secs 55&lt;br /&gt;
SATINFO GOOD ITERATIONS   :3&lt;br /&gt;
SATINFO REJECT ITERATIONS :0&lt;br /&gt;
SATINFO NOTALKER ITERATIONS   :0&lt;br /&gt;
CURRENT MONITOR STATE GNSS&lt;br /&gt;
STATE :Phase-4 NORMAL OPERATION, Monitoring GNSSLOCK&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsatinfo&lt;br /&gt;
GNSS MODE :GPS&lt;br /&gt;
SATELLITE INFORMATION  TALKER:GPS&lt;br /&gt;
NMEA ID : 01-32&lt;br /&gt;
NO OF SATELLITES IN VIEW: 08&lt;br /&gt;
NO OF XXGSV MSGS        : 03&lt;br /&gt;
SatNo   PRN NO (SV ID)      ELEVATION (degs)    AZIMUTH (degs)      C/No (SNR)&lt;br /&gt;
1       0                   0                   0                   0                   &lt;br /&gt;
2       0                   0                   0                   0                   &lt;br /&gt;
3       0                   0                   0                   0                   &lt;br /&gt;
4       0                   0                   0                   0                   &lt;br /&gt;
5       0                   0                   0                   0                   &lt;br /&gt;
6       0                   0                   0                   0                   &lt;br /&gt;
7       0                   0                   0                   0                   &lt;br /&gt;
8       0                   0                   0                   0                   &lt;br /&gt;
&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; End of Sat Info &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showsats&lt;br /&gt;
Total Sats: 8&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.81911&lt;br /&gt;
Longitude: 12313.69595&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-show1ppsstate&lt;br /&gt;
GPS 1PPS STATE: LOCKED&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-showmyloc        &lt;br /&gt;
&lt;br /&gt;
GNSS RECEIVER LOCATION:&lt;br /&gt;
Latitude : 4914.80688&lt;br /&gt;
Longitude: 12313.69531&lt;br /&gt;
&lt;br /&gt;
enter into google maps search box as: 49 14.80688, -123 13.69531, observe the space, the moved dot and the minus.&lt;br /&gt;
&lt;br /&gt;
GNSSAUX&amp;gt; gnss-resetgnss&lt;br /&gt;
&lt;br /&gt;
Executing....Please Wait....&lt;br /&gt;
$$$$$END&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* 1PPS BNC output: period 1 sec, pulse width 200 ms, 3.3V into 1MOhm, 1.38V into 50Ohm.&lt;br /&gt;
* IRIG-B BNC output: 5.6V into 1MOhm, 2.4V into 50Ohm.&lt;br /&gt;
* IRIG-B format selector: default is all up.&lt;br /&gt;
&lt;br /&gt;
== Rb clock PRS10 ==&lt;br /&gt;
&lt;br /&gt;
* https://www.thinksrs.com/products/prs10.html&lt;br /&gt;
* 10 MHz output is sine wave around 5V peak to peak&lt;br /&gt;
* 1PPS BNC output is 10 usec pulse, 5V into 1MHohm.&lt;br /&gt;
* RS232 connection: minicom -D /dev/ttyUSB0 -b 9600&lt;br /&gt;
* ser2net config: localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
* ssh daq13, cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
* ssh daq13, cd ~/daq/ds, python3 prs10.py&lt;br /&gt;
* RS232 commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ID?&lt;br /&gt;
PRS10_3.56_SN_105719&lt;br /&gt;
VB1&lt;br /&gt;
SN?&lt;br /&gt;
RS1 -- reset&lt;br /&gt;
ST? -- status&lt;br /&gt;
FC? -- 10MHz OCXO drive voltage DAC settings&lt;br /&gt;
DS? -- &amp;quot;detected signals&amp;quot;&lt;br /&gt;
GA? -- gain of frequency lock loop between ovenized oscillator and Rb cell, 0=use ovenized oscillator only&lt;br /&gt;
MO? -- magnetic offset of the Rb cell, range 2300..3600, if out of range, unit must be set to different operating mode, see prs10m.pdf&lt;br /&gt;
MR? -- magnetic read&lt;br /&gt;
TT? -- time-tag, time in ns between 1PPS out and 1PPS in&lt;br /&gt;
TS? -- time slope, ???&lt;br /&gt;
TO? -- time offset, ???&lt;br /&gt;
PS? -- pulse slope, ???&lt;br /&gt;
PL? -- 0=phase lock off, 1=phase lock on, lock to 1PPS input&lt;br /&gt;
PT? -- phase lock integrator time constant, PT8 is integrator time constant 18.2 hours, natural time constant 2.25 hours&lt;br /&gt;
PF? -- phase lock stability factor, PF2 is &amp;quot;1&amp;quot;&lt;br /&gt;
PI? -- phase lock integrator&lt;br /&gt;
&lt;br /&gt;
Analog to digital 12 bit ADC, values 0.000 to 4.998&lt;br /&gt;
&lt;br /&gt;
AD0? -- Spare (J204)&lt;br /&gt;
AD1? -- +24V(heater supply) divided by 10.&lt;br /&gt;
AD2? -- +24V(electronics supply) divided by 10&lt;br /&gt;
AD3? -- Drain voltage to lamp FET divided by 10&lt;br /&gt;
AD4? -- Gate voltage to lamp FET divided by 10&lt;br /&gt;
AD5? -- Crystal heater control voltage&lt;br /&gt;
AD6? -- Resonance cell heater control voltage&lt;br /&gt;
AD7? -- Discharge lamp heater control voltage&lt;br /&gt;
AD8? -- Amplified ac photosignal&lt;br /&gt;
AD9? -- Photocell’s I/V converter voltage divided by 4&lt;br /&gt;
AD10? -- Case temperature (10 mV/°C)&lt;br /&gt;
AD11? -- Crystal thermistors&lt;br /&gt;
AD12? -- Cell thermistors&lt;br /&gt;
AD13? -- Lamp thermistors&lt;br /&gt;
AD14? -- Frequency calibration pot / external calibration voltage&lt;br /&gt;
AD15? -- Analog ground&lt;br /&gt;
&lt;br /&gt;
A/D via CPU E-port:&lt;br /&gt;
&lt;br /&gt;
AD16? -- Varactor voltage for 22.48 MHz VCXO (inside RF synthesizer) / 4&lt;br /&gt;
AD17? -- Varactor voltage for 360 MHz VCO (output of RF synthesizer) / 4&lt;br /&gt;
AD18? -- Gain control voltage for amplifier which drives frequency multiplier / 4&lt;br /&gt;
AD19? -- RF synthesizer’s lock indicator voltage (nominally 4.8 V when locked )&lt;br /&gt;
&lt;br /&gt;
ST?&lt;br /&gt;
&lt;br /&gt;
ST1 : Power supplies and Discharge Lamp&lt;br /&gt;
ST1 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- +24 for electronic &amp;lt; +22 Vdc&lt;br /&gt;
1 -- +24 for electronics &amp;gt; +30 Vdc&lt;br /&gt;
2 -- +24 for heaters &amp;lt;+22 Vdc&lt;br /&gt;
3 -- +24 for heaters &amp;gt; +30 Vdc&lt;br /&gt;
4 -- Lamp light level too low&lt;br /&gt;
5 -- Lamp light level too high&lt;br /&gt;
6 -- Gate voltage too low&lt;br /&gt;
7 -- Gate voltage too high&lt;br /&gt;
&lt;br /&gt;
ST2: RF Synthesizer&lt;br /&gt;
ST2 bit, Condition which sets bit, Corrective Action&lt;br /&gt;
0 -- RF synthesizer PLL unlocked&lt;br /&gt;
1 -- RF crystal varactor too low&lt;br /&gt;
2 -- RF crystal varactor too high&lt;br /&gt;
3 -- RF VCO control too low&lt;br /&gt;
4 -- RF VCO control too high&lt;br /&gt;
5 -- RF AGC control too low&lt;br /&gt;
6 -- RF AGC control too high&lt;br /&gt;
7 -- Bad PLL parameter&lt;br /&gt;
&lt;br /&gt;
ST3: Temperature Controllers&lt;br /&gt;
ST3 bit, Condition which sets bit&lt;br /&gt;
0 -- Lamp temp below set point&lt;br /&gt;
1 -- Lamp temp above set point&lt;br /&gt;
2 -- Crystal temp below set point&lt;br /&gt;
3 -- Crystal temp above set point&lt;br /&gt;
4 -- Cell temp below set point&lt;br /&gt;
5 -- Cell temp above set point&lt;br /&gt;
6 -- Case temperature too low&lt;br /&gt;
7 -- Case temperature too high&lt;br /&gt;
&lt;br /&gt;
ST4: Frequency Lock-Loop Control&lt;br /&gt;
ST4 bit, Condition which sets bit&lt;br /&gt;
0 -- Frequency lock control is off&lt;br /&gt;
1 -- Frequency lock is disabled&lt;br /&gt;
2 -- 10 MHz EFC is too high&lt;br /&gt;
3 -- 10 MHz EFC is too low&lt;br /&gt;
4 -- Analog cal voltage &amp;gt; 4.9 V&lt;br /&gt;
5 -- Analog cal voltage &amp;lt; 0.1&lt;br /&gt;
6 -- not used&lt;br /&gt;
7 -- not used&lt;br /&gt;
&lt;br /&gt;
ST5: Frequency Lock to External 1pps&lt;br /&gt;
ST5 bit, Condition which sets bit&lt;br /&gt;
0 -- PLL disabled&lt;br /&gt;
1 -- &amp;lt; 256 good 1pps inputs&lt;br /&gt;
2 -- PLL active&lt;br /&gt;
3 -- &amp;gt; 256 bad 1pps inputs&lt;br /&gt;
4 -- Excessive time interval&lt;br /&gt;
5 -- PLL restarted&lt;br /&gt;
6 -- f control saturated&lt;br /&gt;
7 -- No 1pps input&lt;br /&gt;
&lt;br /&gt;
ST6: System Level Events&lt;br /&gt;
ST6 bit and Condition which sets bit&lt;br /&gt;
0 Lamp restart&lt;br /&gt;
1 Watchdog time-out and reset&lt;br /&gt;
2 Bad interrupt vector&lt;br /&gt;
3 EEPROM write failure&lt;br /&gt;
4 EEPROM data corruption&lt;br /&gt;
5 Bad command syntax&lt;br /&gt;
6 Bad command parameter&lt;br /&gt;
7 Unit has been reset&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on warm start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
received:  PRS_10&lt;br /&gt;
received:  255,255,255,243,34,255&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,1,34,0&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,2,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on loss of external 1PPS&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
...&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
disconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
...&lt;br /&gt;
reconnect 1PPS input&lt;br /&gt;
received:  0,0,0,0,132,0&lt;br /&gt;
received:  0,0,0,0,4,0&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on coldish start&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,0,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 0,0,1,1,34,0 ] old [ 80,0,0,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,1,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,16,1,34,0 ] old [ 0,0,0,1,34,0 ] counter:  6&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,16,1,34,0 ] counter:  5&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  8&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  3&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  49&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  250&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ST? on cold start, note: no bump in the 10MHz clock as reported by DS-DM clock chip&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= det fac integration test =&lt;br /&gt;
&lt;br /&gt;
Connections:&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B SEL&amp;quot; both switches &amp;quot;up&amp;quot; - both &amp;quot;on&amp;quot;, IRIG-B format B004&lt;br /&gt;
* GPS receiver USB-B -&amp;gt; long cable -&amp;gt; daq13 USB-A&lt;br /&gt;
* GPS receiver &amp;quot;1PPS out&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and Rb clock BNC &amp;quot;1PPS in&amp;quot;&lt;br /&gt;
* GPS receiver &amp;quot;IRIG-B 50ohms&amp;quot; -&amp;gt; long BNC cable -&amp;gt; BNC-T -&amp;gt; scope (5V, no 50ohm) and DS-DM LEMO input 1 (TTL mode)&lt;br /&gt;
* Rb clock RS232 -&amp;gt; RS232 straight cable -&amp;gt; RS232-to-USB adapter -&amp;gt; daq13 USB-A&lt;br /&gt;
* Rb clock &amp;quot;1PPS out&amp;quot; BNC -&amp;gt; scope (5V, no 50ohm, trig threshold rising edge 2V)&lt;br /&gt;
* Rb clock &amp;quot;10MHz output 50 Ohm&amp;quot; BNC -&amp;gt; lemo -&amp;gt; lemo-T -&amp;gt; scope (sine wave, 5V, no 50ohm) and DS-DM clock input.&lt;br /&gt;
&lt;br /&gt;
Programs to run:&lt;br /&gt;
* on daq13: cd /home/olchansk/git/ser2net, ./ser2net -c ~/daq/ds/ser2net.conf -d&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
localhost,3001:raw:600:usb-5-2-1.0:9600  -XONXOFF -RTSCTS LOCAL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq13: cd /home/olchansk/daq/ds, python3 prs10.py ### connects to ser2net&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq13:ds$ python3 prs10.py&lt;br /&gt;
Connected&lt;br /&gt;
received [  ] old [ b&#039;&#039; ] counter:  0&lt;br /&gt;
received [ PRS_10 ] old [  ] counter:  0&lt;br /&gt;
received [ 255,255,255,243,34,255 ] old [ PRS_10 ] counter:  0&lt;br /&gt;
received [ 80,0,21,1,34,1 ] old [ 255,255,255,243,34,255 ] counter:  0&lt;br /&gt;
received [ 64,0,21,1,34,0 ] old [ 80,0,21,1,34,1 ] counter:  0&lt;br /&gt;
received [ 0,0,21,1,34,0 ] old [ 64,0,21,1,34,0 ] counter:  0&lt;br /&gt;
received [ 0,0,20,1,34,0 ] old [ 0,0,21,1,34,0 ] counter:  158&lt;br /&gt;
received [ 0,0,4,1,34,0 ] old [ 0,0,20,1,34,0 ] counter:  23&lt;br /&gt;
received [ 0,0,0,1,34,0 ] old [ 0,0,4,1,34,0 ] counter:  47&lt;br /&gt;
received [ 0,0,0,0,2,0 ] old [ 0,0,0,1,34,0 ] counter:  40&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,2,0 ] counter:  249&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  12096&lt;br /&gt;
received [ 0,0,0,0,20,0 ] old [ 0,0,0,0,132,0 ] counter:  2&lt;br /&gt;
received [ 0,0,0,0,148,0 ] old [ 0,0,0,0,20,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,148,0 ] counter:  575&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  11449&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  2755&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  34386&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  41035&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  113401&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33375&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  54767&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  85059&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  33222&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  119234&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  121990&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  128184&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  56002&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  428237&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  8250&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  30506&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  142704&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  179451&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  106182&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  68747&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  65424&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  157587&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  6932&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  1388&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  20255&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  4&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  225941&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  72183&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  0&lt;br /&gt;
received [ 0,0,0,0,132,0 ] old [ 0,0,0,0,4,0 ] counter:  26970&lt;br /&gt;
received [ 0,0,0,0,4,0 ] old [ 0,0,0,0,132,0 ] counter:  1&lt;br /&gt;
39287&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on ds-dm: ./test_cdm.exe --irigb ### note sbs mismatch is because I should wrap around at 16 bits&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00000000S100001010S...S001010101S000001000S, sec: 00, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16724 should be 82260&lt;br /&gt;
dataframe: S10000000S100001010S...S101010101S000001000S, sec: 01, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16725 should be 82261&lt;br /&gt;
dataframe: S01000000S100001010S...S011010101S000001000S, sec: 02, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16726 should be 82262&lt;br /&gt;
dataframe: S11000000S100001010S...S111010101S000001000S, sec: 03, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16727 should be 82263&lt;br /&gt;
dataframe: S00100000S100001010S...S000110101S000001000S, sec: 04, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16728 should be 82264&lt;br /&gt;
dataframe: S10100000S100001010S...S100110101S000001000S, sec: 05, min: 51, hrs: 22, day of year: 300, year: 2023, date: 27 oct, sbs: 16729 should be 82265&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= DS-IOGC GPS interface board =&lt;br /&gt;
&lt;br /&gt;
* Rev0 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/tree/main?ref_type=heads&lt;br /&gt;
* Rev0 schematics: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev0/-/blob/main/Altium/Project%20Outputs%20for%20DS-IOGC-Rev0/SCH-DS-IOGC-Rev0.pdf?ref_type=heads&lt;br /&gt;
* Rev0 schematics: [[:Image:SCH-DS-IOGC-Rev0.pdf|SCH-DS-IOGC-Rev0]]&lt;br /&gt;
* Rev1 git repository: https://edev-group.triumf.ca/hw/exp/dark-side-20k/dark-side-iogc/rev1/&lt;br /&gt;
* Rev1 schematics: [[:Image:SCH-DS-IOGC-Rev1.pdf|SCH-DS-IOGC-Rev1]]&lt;br /&gt;
&lt;br /&gt;
== Changes Rev0 to Rev1 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From: Peter Margetak &amp;lt;pmargetak@triumf.ca&amp;gt;&lt;br /&gt;
Subject: IOGC REV1 review&lt;br /&gt;
Date: Wed, 4 Sep 2024 07:31:19 +0000&lt;br /&gt;
&lt;br /&gt;
Hi Konstantin,&lt;br /&gt;
Pls have a look at SCH for new rev. I&#039;d like to send it to mfr next week so if you can comment by early next week. Meanwhile I work on layout and other stuff.&lt;br /&gt;
&lt;br /&gt;
Changes:&lt;br /&gt;
&lt;br /&gt;
New ICs - all powered +5V&lt;br /&gt;
U20 - inverters for  RUclk RX/TX&lt;br /&gt;
U21 - non inverting line driver for RU-1pps-out (so you don&#039;t have to route if via GDM to see it on scope)&lt;br /&gt;
U22 - non inverting buffer for ext 1pps input&lt;br /&gt;
&lt;br /&gt;
All Lemo connectors have the same position but they are double lemos now =&amp;gt; new panel needed&lt;br /&gt;
@Marek Walczak&amp;lt;mailto:mwalczak@triumf.ca&amp;gt; you can print it ahead once pcb is done + update IOGC docs and panel description&lt;br /&gt;
&lt;br /&gt;
J2A/B - Test ports for RU-1pps in and out&lt;br /&gt;
J5A/B - inputs for external GPS data and External source of 1pps&lt;br /&gt;
J6A/B  - aux in/out for GDM&lt;br /&gt;
&lt;br /&gt;
SW1 - no change - select RX/TX  USB/GDM&lt;br /&gt;
SW2 - select latch sensitivity for rising/falling edge&lt;br /&gt;
SW3 - select source of GPS data (opto or ext)  AND select source of 1pps input (latch or ext)&lt;br /&gt;
&lt;br /&gt;
p.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== PRS-10 Rb clock device ==&lt;br /&gt;
&lt;br /&gt;
The Rb clock PRS-10 device provides these connections:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
RS232 RX input - serial communication, non-standard RS232&lt;br /&gt;
RS232 TX output - serial communication, non-standard RS232&lt;br /&gt;
10 MHz clock output - coax 50 Ohm high resolution 10 MHz clock&lt;br /&gt;
1pps output - 1 Hz clock corresponding to the 10 MHz clock&lt;br /&gt;
1pps input - 1pps signal from GPS receiver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Mode of operation:&lt;br /&gt;
* 10 MHz clock is always running&lt;br /&gt;
* 1pps output is always running&lt;br /&gt;
* if 1pps input from GPS received is present, after 256 pulses PRS-10 will sync it&#039;s 1pps output with the 1pps input by adjusting the frequency of the 10 MHz clock&lt;br /&gt;
* when unlocked: 1pps output and 1pps input unrelated&lt;br /&gt;
* when locked to GPS: 1pps output and 1pps input always go up and down at the same time&lt;br /&gt;
&lt;br /&gt;
Theory of operation:&lt;br /&gt;
* 10 MHz clock is produced by a high-quality crystal (stable on the scale of seconds)&lt;br /&gt;
* crystal oscillator is synchronized to a Rb cell (stable on the scale of hours and days)&lt;br /&gt;
* Rb cell resonant frequency is synchronized to the GPS 1pps signal (stable on the scale of months and years)&lt;br /&gt;
&lt;br /&gt;
== Rev1 connections ==&lt;br /&gt;
&lt;br /&gt;
* LEMO connectors (front panel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
LEMO J2A output - Rb clock 1pps in monitor&lt;br /&gt;
LEMO J2B output - Rb clock 1pps out monitor&lt;br /&gt;
LEMO J5A input  - GPS IRIG-B from GPS receiver to FPGA (VCL-2705)&lt;br /&gt;
LEMO J5B input  - GPS 1pps from GPS receiver to PRS-10 (VCL-2705)&lt;br /&gt;
LEMO J6A output - AUX-OUT from FPGA (dual-LEMO PCB-side)&lt;br /&gt;
LEMO J6B input  - AUX-IN to FPGA (dual-LEMO away-from -PCB)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* SMB connectors (back)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SMB J3 output - GPS 1pps loopback to LNGS&lt;br /&gt;
SMB J4 input - LNGS GPS data input&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* LEDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
D1 - same as LEMO J2A out (Rb clock 1pps in)&lt;br /&gt;
D2 - same as SMB J3 out (GPS 1pps from LNGS or from a GPS receiver)&lt;br /&gt;
D5 - controlled by FPGA-OUT-LED1&lt;br /&gt;
D6 - controlled by FPGA-OUT-LED2&lt;br /&gt;
D7 - PRS-10 24V power ok&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* switches&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SW1A and SW1B - route PRS-10 RS232 to USB or to FPGA&lt;br /&gt;
SW2A - route PRS-10 1pps input from SMB J4 (LNGS) or from LEMO J5B (GPS receiver 1pps)&lt;br /&gt;
SW2B - route FPGA-IN-GPSDATA input from SMB J4 (LNGS) or from LEMO J5A (GPS receiver IRIG-B data)&lt;br /&gt;
SW3 - LNGS 1pps from rising edge or from falling edge of SMB J4 (LNGS)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Rb clock cable ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Rb clock ----- DS-IOGC side, pin numbers are as labeled on the cable connectors&lt;br /&gt;
&lt;br /&gt;
1 - 1pps out - 8 - 1pps out                    --- correct&lt;br /&gt;
2 - nc&lt;br /&gt;
3 - nc&lt;br /&gt;
4 - TXD      - 3  - RU-DATA-OUT - USB-RX input --- correct&lt;br /&gt;
5 - 1pps in  - 2  - 1pps in                    --- correct&lt;br /&gt;
6 - +24V     - 10 - +24V                       --- should by pin 1 to use both +24V pins?&lt;br /&gt;
7 - RXD      - 15 - RU-DATA-IN - USB-TX output --- correct&lt;br /&gt;
8 - nc&lt;br /&gt;
9 - +24V     - 10 - +24V --- correct&lt;br /&gt;
10 - GND     - 9  - GND  --- correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== VX connections ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
VXA_TX0 - FPGA-OUT-LED2 - D6 LED (&amp;quot;10 MHz clock&amp;quot;)&lt;br /&gt;
VXA_TX1 - FPGA-OUT-LED1 - D5 LED (&amp;quot;GPS DATA&amp;quot;)&lt;br /&gt;
VXA_TX2 - FPGA-OUT-RU1PPS-EN - enable 1pps to Rb clock&lt;br /&gt;
VXA_TX3 - not used (62.5 Hz clock)&lt;br /&gt;
&lt;br /&gt;
VXB_TX0 - FPGA-TX - PRS-10 RS-232 out&lt;br /&gt;
VXB_TX1 - FPGA-OUT-AUX - 5V TTL J5 LEMO out&lt;br /&gt;
VXB_TX2 - FPGA-OUT-OPTO1PPS-EN - PRS-10 power enable&lt;br /&gt;
VXB_TX3 - not used (62.5 MHz clock)&lt;br /&gt;
&lt;br /&gt;
VXA_RX0 - FPGA-IN-OPTO1PPS - 1pps from GPS&lt;br /&gt;
VXA_RX1 - FPGA-IN-GPSDATA - J4 GPS data&lt;br /&gt;
VXA_RX2 - n/c&lt;br /&gt;
VXA_RX3 - n/c&lt;br /&gt;
&lt;br /&gt;
VXB_RX0 - n/c&lt;br /&gt;
VXB_RX1 - FPGA-IN-AUX - J5 LEMO TTL input&lt;br /&gt;
VXB_RX2 - FPGA-RX - PRS-10 RS-232 in&lt;br /&gt;
VXB_RX3 - FPGA-IN_RU1PPS - PRS-10 1pps output&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== test sequence ==&lt;br /&gt;
&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0 ### clear reg 7&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 0 ### set vx_tx mux to vx_tx control from reg 7&lt;br /&gt;
* connect blue cable to GDM port 6 (next to the ethernet connector)&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4000 ### power up&lt;br /&gt;
* test LEDs:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4100 ### right LED2 D6&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x4200 ### left LED1 D5&lt;br /&gt;
* test AUX-IN and AUX-OUT:&lt;br /&gt;
* ./test_cdm_local.exe --writereg 7 0x6000 ### J6A LEMO (PCB-side) measure +5VDC&lt;br /&gt;
* install LEMO jumper between LEMO J6A and J6B&lt;br /&gt;
* write 0x4000 then ./test_cdm_local.exe 6 ### reads 0x5C, bit 5 0x20 reads 0&lt;br /&gt;
* write 0x6000 then ./test_cdm_local.exe 6 ### reads 0x7C, bit 5 0x20 reads 1&lt;br /&gt;
* write 0x4000 to clear all bits&lt;br /&gt;
* test the 10 MHz clock:&lt;br /&gt;
* init the c.c: ./test_cdm_local.exe --load-cc&lt;br /&gt;
* connect 10 MHz clock output to DS-DM LEMO J6-LEFT (CLK_EXT1)&lt;br /&gt;
* 10 MHz output ok - IN0 is good: ./test_cdm_local.exe --cc&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* without 10 MHz reports IN0 LOS (no signal) and OOF (wrong frequency)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Clock chip state 1, status:  LOS_IN0 OOF_IN0 OOF_IN2 IN1 IN_SEL_1 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test GPS IRIG-B data:&lt;br /&gt;
* connect GPS IRIG-B signal to J6B (dual-LEMO away from PCB)&lt;br /&gt;
* IRIG-B via AUX-IN is ok: ./test_cdm_local.exe --irigb&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dataframe: S00100110S111001000S...S011110000S010000000S, sec: 34, min: 17, hrs: 00, day of year: 223, year: 2024, date: 10 aug, sbs:  1054 should be  1054&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test IRIG-B via J5A GPS-EXT:&lt;br /&gt;
* connect GPS IRIG-B signal to J5A (dual-LEMO next to PCB)&lt;br /&gt;
* set SW2B: switch on the side of SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* ./test_cdm_local.exe --irigb built for VXA_RX1 should work&lt;br /&gt;
* test GPS 1pps signal:&lt;br /&gt;
* connect GPS 1pps to J5B (dual-LEMO away from PCB)&lt;br /&gt;
* nothing happens, no output from U22&lt;br /&gt;
* remove R51&lt;br /&gt;
* set SW2A: switch on the side away from SMB connectors, slide direction of 24V power supply connector&lt;br /&gt;
* observe LEDs D1 and D2 blink at 1Hz&lt;br /&gt;
* SKIP THIS connect GPS 1pps to J4 using LEMO-SMB adapter&lt;br /&gt;
* SKIP THIS nothing happens, nLE is always 3.2V, both settings of SW2&lt;br /&gt;
* SKIP THIS !!!failed here!!!&lt;br /&gt;
* ./test_cdm_local.exe --writereg 8 9 ### set vx_tx mux to GPS control, hard enables PRS-10 power and PRS-10 1pps in&lt;br /&gt;
* observe 1pps counters in reg 68 count at 1 Hz: rb_1pps 0x51-&amp;gt;0x52, gps_1pps 0xd5-&amp;gt;oxd6&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 68&lt;br /&gt;
ds20k_reg[68] is 0x0051d520 (5362976)&lt;br /&gt;
ds20k_reg[68] is 0x0052d624 (5428772)&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe PRS-10 can see the 1pps signal &amp;quot;130&amp;quot; changes to &amp;quot;2&amp;quot; after 243 seconds to &amp;quot;4&amp;quot;&lt;br /&gt;
* observe period of GPS and PRS-10 1pps is identical (plus/minus 1 clock)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x077356d4 (124999380)&lt;br /&gt;
ds20k_reg[14] is 0x077356d4 (124999380)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GDM/CDM clocks are exactly 125 MHz, we are running on DS-DM internal oscillator&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735943 (125000003) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if tx_clk is missing, reset the mgt: ./test_cdm_local.exe --reset-mgt&lt;br /&gt;
* switch CC to external clock: &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc-in0&lt;br /&gt;
CC use clock input 0: 10 MHz LEMO external clock&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --cc&lt;br /&gt;
Polling CC status...&lt;br /&gt;
Clock chip state 1, status:  IN0 IN_SEL_REGCTRL IN_SEL_0 HOLD_HIST_VALID&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe rx_clk and tx_clk are now slightly off: they run from PRS-10 10 MHz clock and are measured against the DS-DM internal oscillator.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe --gdm-clocks&lt;br /&gt;
DS-DM mapping /dev/mem at 0x80010000&lt;br /&gt;
DS-DM FPGA firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
DS-DM firmware build 0x94b12519, ds20k version 0x20240814&lt;br /&gt;
GDM clock frequency counters:&lt;br /&gt;
0x1030 mgt_rx_ref_clk_raw: 0x077358e1 (124999905) should be ~125 MHz&lt;br /&gt;
0x1034 rx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1038 mgt_tx_ref_clk_raw: 0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x103C tx_clk:             0x07735b49 (125000521) should be ~125 MHz&lt;br /&gt;
0x1040 clk_50MHz:          0x02faf080 (50000000) should be 50 MHz exactly&lt;br /&gt;
0x1044 Block1_clk:         0x05f5e100 (100000000) should be 100 MHz exactly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* observe GPS and PRS-10 1pps period is now exactly 125*10^6 of 8ns clocks  (equal to 1 second)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdm:~# ./test_cdm_local.exe 13 14&lt;br /&gt;
ds20k_reg[13] is 0x0773593f (124999999)&lt;br /&gt;
ds20k_reg[14] is 0x0773593f (124999999)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* look at them repeatedly, observe reg 13 &amp;quot;GPS 1pps period&amp;quot; has some wobble, reg 14 &amp;quot;Rb clock 1pps period&amp;quot; is steady. this is as expected: if GPS 1pps was steady, we do not need to Rb clock. PRS-10 1pps is derived from the PRS-10 10 MHz clock and is measured against the 125 MHz clock derived from the same 10 MHz clock in the GDM FPGA.&lt;br /&gt;
&lt;br /&gt;
Rev0 Test status:&lt;br /&gt;
&lt;br /&gt;
* GPS 1pps to SMB-in ok (LED flashes)&lt;br /&gt;
* GPS 1pps to FPGA ok&lt;br /&gt;
* GPS data to FPGA ok&lt;br /&gt;
* GPS 1pps to PRS-10 enabled from FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA to LEMO AUX out ok&lt;br /&gt;
* can see GPS 1pps, IRIG-B, PRS-10 1pps out, 10 MHz on the scope, ok&lt;br /&gt;
* PRS-10 syncs on leading edge (0-&amp;gt;1) of GPS 1pps signal, ok&lt;br /&gt;
* reg 13 and 14 1pps periods are identical, ok&lt;br /&gt;
* CC locks on PRS-10 10 MHz clock, DS-DM runs on PRS-10 clock, ok&lt;br /&gt;
* NOT TESTED - smb output&lt;br /&gt;
* NOT TESTED - optical converter fiber to SMB&lt;br /&gt;
* NOT TESTED - optical converter SMB to fiber&lt;br /&gt;
* NOT TESTED - SMB loopback&lt;br /&gt;
* NOT TESTED - fiber loopback&lt;br /&gt;
&lt;br /&gt;
Rev1 Test status: (21 Nov 2024)&lt;br /&gt;
&lt;br /&gt;
* power up ok&lt;br /&gt;
* LEDs ok&lt;br /&gt;
* LEMO AUX-IN, AUX-out ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J6B AUX-IN ok&lt;br /&gt;
* GPS IRIG-B to FPGA via J5A GPS-EXT ok&lt;br /&gt;
* PRS-10 Rb clock 1pps out to FPGA ok&lt;br /&gt;
* PRS-10 Rb clock 10 MHz to C.C. ok&lt;br /&gt;
* PRS-10 RS-232 ok&lt;br /&gt;
* J5B 1pps input fail. input signal is 3.3V without termination, 1.5V when plugged into IOGC (on R51), no output from U22.&lt;br /&gt;
&lt;br /&gt;
= VX busy logic =&lt;br /&gt;
&lt;br /&gt;
= DS-20K DAQ =&lt;br /&gt;
&lt;br /&gt;
== Overview ==&lt;br /&gt;
&lt;br /&gt;
DS-DM, GDM and CDM are key parts of the DS-20K DAQ system:&lt;br /&gt;
* common clock distribution from external clock (atomic clock, GPS) to GDM to per-quadrant CDMs to VX digitizers&lt;br /&gt;
* common trigger distribution from GDM internal algorithm or external input to all VX digitizers&lt;br /&gt;
* run control: GDM, CDM, VX all start recording data at the same time (clock and timestamp reset)&lt;br /&gt;
* collection of trigger data from VX digitizers to per-quadrant CDMs to GDM&lt;br /&gt;
&lt;br /&gt;
== Deliverables ==&lt;br /&gt;
&lt;br /&gt;
* hardware and firmware for GDM to CDM clock distribution&lt;br /&gt;
* hardware and firmware for CDM to VX clock distribution&lt;br /&gt;
* hardware and firmware for GDM external clock input (atomic clock or GPS)&lt;br /&gt;
* hardware and firmware for CDM and VX serial communications (VX LVDS I/O connector)&lt;br /&gt;
* firmware for run control (timestamp reset and sync): GDM to CDM to VX&lt;br /&gt;
* firmware for common trigger distribution: GDM to CDM to VX&lt;br /&gt;
* firmware for trigger data flow: VX to CDM to GDM&lt;br /&gt;
* firmware for busy control: VX to CDM to GDM back to CDM to VX&lt;br /&gt;
* firmware for flow control: FEP to GDM MIDAS frontend to GDM to CDM to VX&lt;br /&gt;
* GDM MIDAS frontend: clock selector and monitoring, trigger and run control, busy and flow control, GDM housekeeping&lt;br /&gt;
* CDM MIDAS frontend: clock monitoring, CDM housekeeping&lt;br /&gt;
&lt;br /&gt;
specific performance:&lt;br /&gt;
* GDM external clock: 10 MHz GPS clock&lt;br /&gt;
* GDM to CDM fiber link:&lt;br /&gt;
** clock XXX MHz&lt;br /&gt;
** link data rate: XXX Gbit/sec&lt;br /&gt;
** CDM recovered clock: XXX MHz&lt;br /&gt;
** CDM recovered clock jitter: XXX ns&lt;br /&gt;
** phase alignment between CDMs: XXX ns&lt;br /&gt;
** phase alignment between CDMs persists across reboots, power cycles, firmware updates&lt;br /&gt;
** phase alignment between CDMs should be easy to measure&lt;br /&gt;
** phase alignment between CDMs should be easy to recalibrate if hardware parts are replaced (DS-DM boards, fiber transceivers, fiber cables, etc)&lt;br /&gt;
** data packet bandwidth: XXX Mbytes/sec&lt;br /&gt;
** data packet latency: XXX clocks&lt;br /&gt;
** data packet skew between CDMs: XXX clocks&lt;br /&gt;
* CDM to VX clock:&lt;br /&gt;
** clock: XXX MHz&lt;br /&gt;
** jitter, all CDM clock outputs: XXX MHz&lt;br /&gt;
** phase alignment between all CDM clock outputs: XXX ns&lt;br /&gt;
* CDM to VX trigger:&lt;br /&gt;
** TBD (use the VX &amp;quot;sync&amp;quot; input or VX LVDS I/O line or VX serial link packet)&lt;br /&gt;
* CDM to VX serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* VX to CDM serial link:&lt;br /&gt;
** clock: XXX MHz (TBD: VX external clock, or LVDS I/O line or link recovered clock)&lt;br /&gt;
** bit rate: XXX bits/sec&lt;br /&gt;
** latency: XXX link clocks&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* timestamp reset:&lt;br /&gt;
** maximum skew between VXes: XXX ns&lt;br /&gt;
* busy round trip time: XXX ns (VX to CDM to GDM back to CDM to VX)&lt;br /&gt;
* flow control latency: XXX ns (FEP software to GDM MIDAS frontend to GDM to CDM to VX)&lt;br /&gt;
&lt;br /&gt;
== Technical risk items ==&lt;br /&gt;
&lt;br /&gt;
this refers to unexpected behaviour and performance of&lt;br /&gt;
system components, causes big difficulty in implementing the system,&lt;br /&gt;
prevents delivery of deliverables, and prevents or negatively affects operation&lt;br /&gt;
of the DS-20K DAQ or of the whole experiment.&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022, list is not sorted by any criterial: severity, probability, ease of investigation)&lt;br /&gt;
&lt;br /&gt;
(stability of course is long term stability, across hours, days, weeks, months, years)&lt;br /&gt;
&lt;br /&gt;
* stability of Enclustra FPGA modules (crashes/year, failures to boot/year, flash corruption/year)&lt;br /&gt;
* stability of GDM external clock PLL (lock loss/year)&lt;br /&gt;
* stability of CDM recovered clock (lock loss/year, unexpected phase drifts, etc)&lt;br /&gt;
* unexpected failures or bit error rates in GDM-CDM fiber links&lt;br /&gt;
* stability of CDM VX clock outputs (stability of clock cleaner chip)&lt;br /&gt;
* stability of VX internal clock distribution (VX PLL lock loss events)&lt;br /&gt;
* stability of VX CAEN base firmware (different versions of CAEN base firmware have different clock distribution behaviour)&lt;br /&gt;
* strange things in CAEN base firmware (unexpected clocking of LVDS I/O, unexpected phase shifts between clocks, etc)&lt;br /&gt;
* DS-DM and VX hardware problems (incompatible LVSD I/O, incompatible clock signals, etc)&lt;br /&gt;
&lt;br /&gt;
== Milestones ==&lt;br /&gt;
&lt;br /&gt;
(14-sep-2022: at this stage of the project, priority must be given to identifying and retiring (so called) technical risk factors. it is not good to build the complete system only to discover that (for example) some Enclustra FPGA modules require 5 attempts to boot and erase their flash memory contents once a month. Both example are real-life actual problems that caused big difficulties in GRIFFIN/TIGRESS and ALPHA-g experiments).&lt;br /&gt;
&lt;br /&gt;
Development and testing milestones in time reversed order:&lt;br /&gt;
&lt;br /&gt;
* full DAQ data challenge: all VXes, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* one quadrant data challenge: 1 VME crate of VX, CDM, GDM, network, FEP, TSP, MIDAS operate as designed&lt;br /&gt;
* vertical slice data challenge: 1 VME crate, 2 VX, 2 CDM (1 VX per CDM), GDM, etc operate as designed&lt;br /&gt;
* GDM-CDM link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* CDM-VX serial link finalized (data rate frozen, data packet format frozen, data content permitted to change)&lt;br /&gt;
* run control (timestamp reset) and trigger distribution design agreed upon, frozen (list of possible triggers permitted to change)&lt;br /&gt;
* VX to CDM to GDM data flow design agreed upon, frozen (data contents permitted to change)&lt;br /&gt;
* major technical risk items retired (all hardware and firmware is working as expecred without mysteries and surprises, all problems are identified, investigated, resolved, solutions tested)&lt;br /&gt;
* stable operation of CDM-VX serial links in vertical slice system&lt;br /&gt;
* stable operation of GDM to CDM clock in vertical slice system&lt;br /&gt;
* stable operation of CDM to VX clock in vertical slice system&lt;br /&gt;
* vertical slice system assembled (1 VME crate, 2 VX, 2 CDM, 1 GDM, network, FEP, TSP, MIDAS)&lt;br /&gt;
&lt;br /&gt;
= ZZZ =&lt;br /&gt;
&lt;br /&gt;
ZZZ&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Raspbian&amp;diff=8795</id>
		<title>Raspbian</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Raspbian&amp;diff=8795"/>
		<updated>2026-03-26T17:37:30Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* &amp;quot;lite&amp;quot; image missing packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspbian OS =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://www.raspberrypi.org/software/operating-systems/&lt;br /&gt;
&lt;br /&gt;
= Versions =&lt;br /&gt;
&lt;br /&gt;
* buster is debian 10&lt;br /&gt;
* bullseye is debian 11&lt;br /&gt;
* bookworm is debian 12&lt;br /&gt;
&lt;br /&gt;
= install RPi4 from scratch =&lt;br /&gt;
&lt;br /&gt;
* download 2024-11-19-raspios-bookworm-arm64-lite.img.xz&lt;br /&gt;
* cd /daq/daqstore/olchansk/linux/Raspbian/&lt;br /&gt;
* insert 16GB or bigger SD card into /dev/sdX&lt;br /&gt;
* xzcat 2024-11-19-raspios-bookworm-arm64-lite.img.xz | dd of=/dev/sdX bs=1024k status=progress&lt;br /&gt;
* fdisk -l ### to see if it worked&lt;br /&gt;
* eject /dev/sdX&lt;br /&gt;
* insert SD card into RPi4&lt;br /&gt;
* power up&lt;br /&gt;
* observe boot&lt;br /&gt;
* observe ask for language and keyboard layout, select English/US&lt;br /&gt;
* observe ask for create user, use &amp;quot;wheel&amp;quot; and password&lt;br /&gt;
* observe boot to login prompt&lt;br /&gt;
* login as wheel&lt;br /&gt;
* sudo /bin/bash&lt;br /&gt;
* ifconfig eth0 142.90.x.y netmask 255.255.224.0 ### use armdaq01 142.90.121.101&lt;br /&gt;
* route add default gw 142.90.100.18&lt;br /&gt;
* ping 142.90.100.18&lt;br /&gt;
* systemctl restart systemd-timesyncd&lt;br /&gt;
* date ### check date is correct&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* (forgot to enable ssh!!!)&lt;br /&gt;
* apt install ssh&lt;br /&gt;
* systemctl enable ssh&lt;br /&gt;
* rpi-eeprom-update ### check boot loader firmware version, current and available may be different&lt;br /&gt;
* rpi-eeprom-update -a ### prepare firmware update, actual update is done on next boot&lt;br /&gt;
* shutdown -r now ### update firmware and boot new kernel&lt;br /&gt;
* login as wheel&lt;br /&gt;
* rpi-eeprom-update ### check boot loader firmware version, current and available should be same&lt;br /&gt;
* raspi-config ### in advanced options, set boot order to network-first&lt;br /&gt;
* maybe verify the changes took, BOOT_ORDER should read 0xf21 for boot from SD card, if absent, boot from network&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@magpi03:~# vcgencmd bootloader_config&lt;br /&gt;
[all]&lt;br /&gt;
BOOT_UART=0&lt;br /&gt;
WAKE_ON_GPIO=1&lt;br /&gt;
POWER_OFF_ON_HALT=0&lt;br /&gt;
[all]&lt;br /&gt;
BOOT_ORDER=0xf21&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* shutdown -h now&lt;br /&gt;
* power down&lt;br /&gt;
* remove SD card&lt;br /&gt;
* power up&lt;br /&gt;
* observe it&#039;s dhcp requests&lt;br /&gt;
&lt;br /&gt;
= install RPi5 from scratch =&lt;br /&gt;
&lt;br /&gt;
* same as above&lt;br /&gt;
* use 2025-05-13-raspios-bookworm-arm64-lite.img.xz&lt;br /&gt;
* after enabling boot from network, vcgencmd reports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[all]&lt;br /&gt;
BOOT_UART=1&lt;br /&gt;
POWER_OFF_ON_HALT=0&lt;br /&gt;
BOOT_ORDER=0xf461&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= setup network booting =&lt;br /&gt;
&lt;br /&gt;
* setup dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf &lt;br /&gt;
# DNS settings &lt;br /&gt;
port=0 # disable DNS function &lt;br /&gt;
#port=53 # enable DNS function &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp4s0 # DHCP interface &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
log-dhcp &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
#dhcp-ignore=tag:!known &lt;br /&gt;
dhcp-host=dc:a6:32:d5:d9:8d,set:rpi4,set:dlpi,192.168.0.3,dlpi,infinite &lt;br /&gt;
# TFTP settings &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
# RPi4 settings &lt;br /&gt;
dhcp-option-force=tag:dlpi,option:root-path,192.168.0.1:/nfsroot/dlpi,vers=3,tcp,rw&lt;br /&gt;
pxe-service=tag:rpi4,0,&amp;quot;Raspberry Pi Boot&amp;quot; &lt;br /&gt;
 # end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* most important is the &amp;quot;pxe-service&amp;quot; entry to enable RPi4 tftp boot&lt;br /&gt;
* systemctl dnsmasq restart&lt;br /&gt;
* observe RPi4 is doing message type 2 and message type 5&lt;br /&gt;
* followed by requests for files under /tftpboot/eb47cd4d (numbers is the RPi4 serial number)&lt;br /&gt;
* mkdir /nfsroot/dlpi, /nfsroot/dlpi-firmware&lt;br /&gt;
* rsync files from SD card partition 1 (VFAT) to /nfsroot/dlpi-firmware&lt;br /&gt;
* rsync files from SD card partition 2 (ext4) to /nfsroot/dlpi&lt;br /&gt;
* edit /etc/exportfs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dlpi  dlpi(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
/nfsroot/dlpi-firmware  dlpi(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rv&lt;br /&gt;
* ln -s /nfsroot/dlpi-firmware /tftpboot/eb47cd4d&lt;br /&gt;
* edit /nfsroot/dlpi-firmware/cmdline.txt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
console=serial0,115200 console=tty1 ip=dhcp root=/dev/nfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /nfsroot/dlpi/etc/fstab, comment out mount of &amp;quot;/&amp;quot; and &amp;quot;/boot/firmware&amp;quot; add NFS mounts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.1:/nfsroot/dlpi / nfs defaults&lt;br /&gt;
192.168.0.1:/nfsroot/dlpi-firmware /boot/firmware nfs defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* alternatively, combine dlpi-firmware into /nfsroot/dlpi/boot/firmware, ln -s ln -s /nfsroot/dlpi/boot/firmware /tftpboot/db79fb39&lt;br /&gt;
* cycle power RPi4&lt;br /&gt;
* observe /var/log/syslog sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2025-02-12T17:36:54.284833-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.285598-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 vendor class: PXEClient:Arch:00000:UNDI:002001&lt;br /&gt;
2025-02-12T17:36:54.285646-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPDISCOVER(enp4s0) dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:36:54.285693-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:36:54.285753-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPOFFER(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:36:54.285850-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 requested options: 1:netmask, 3:router, 43:vendor-encap, 60:vendor-class, &lt;br /&gt;
2025-02-12T17:36:54.285948-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 requested options: 66:tftp-server, 67:bootfile-name, 128, 129, &lt;br /&gt;
2025-02-12T17:36:54.286020-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 requested options: 130, 131, 132, 133, 134, 135&lt;br /&gt;
2025-02-12T17:36:54.286128-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.286214-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  1 option: 53 message-type  2&lt;br /&gt;
2025-02-12T17:36:54.286267-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.286330-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:36:54.286381-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.286461-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:36:54.286557-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.286616-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:36:54.286690-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  9 option: 60 vendor-class  50:58:45:43:6c:69:65:6e:74&lt;br /&gt;
2025-02-12T17:36:54.286758-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 17 option: 97 client-machine-id  00:34:69:50:52:14:31:d0:00:32:d5:d9:8d:4d...&lt;br /&gt;
2025-02-12T17:36:54.286807-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 32 option: 43 vendor-encap  06:01:03:0a:04:00:50:58:45:09:14:00:00:11...&lt;br /&gt;
2025-02-12T17:36:54.286856-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.286906-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 vendor class: PXEClient:Arch:00000:UNDI:002001&lt;br /&gt;
2025-02-12T17:36:54.287008-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPREQUEST(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:36:54.287137-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:36:54.287189-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPACK(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d dlpi&lt;br /&gt;
2025-02-12T17:36:54.287241-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.287316-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  1 option: 53 message-type  5&lt;br /&gt;
2025-02-12T17:36:54.287381-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.287430-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:36:54.287498-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.287588-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:36:54.287650-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.287707-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:36:54.287788-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:36:54.287922-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.288098-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/start4.elf to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.288175-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.288328-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/pieeprom.sig to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.466481-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/pieeprom.upd to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.521733-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recover4.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.522145-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.501376-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/start4.elf to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.552921-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/fixup4.dat to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.785337-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.785969-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.786047-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.786300-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.787049-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/dt-blob.bin not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.822865-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.823335-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.823397-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.823593-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.599954-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/bootcfg.txt not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.624989-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery8.img not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625545-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625605-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625921-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625993-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626224-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626318-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626556-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626628-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626781-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626818-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.591162-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.607851-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.607926-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/bcm2711-rpi-4-b.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.615129-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/bcm2711-rpi-4-b.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.629371-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.629455-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/overlays/overlay_map.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.630176-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/overlays/overlay_map.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.654215-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.654286-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.654557-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.660372-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.660459-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/overlays/vc4-kms-v3d-pi4.dtbo to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.660958-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/overlays/vc4-kms-v3d-pi4.dtbo to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.887880-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.887973-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/cmdline.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.888037-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/cmdline.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:58.012839-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/armstub8-gic.bin not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:58.013283-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:58.013394-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:59.184059-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:37:07.391950-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.392121-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPDISCOVER(enp4s0) dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.392231-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.392276-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPOFFER(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.392318-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.392375-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 15:domain-name, 17:root-path, 26:mtu, 40:nis-domain, &lt;br /&gt;
2025-02-12T17:37:07.392449-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 42:ntp-server&lt;br /&gt;
2025-02-12T17:37:07.392495-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.392551-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  1 option: 53 message-type  2&lt;br /&gt;
2025-02-12T17:37:07.392655-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.392722-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.392803-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.392843-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.392881-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.392927-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.392963-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.399482-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.399553-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 client provides name: dlpi&lt;br /&gt;
2025-02-12T17:37:07.399599-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPREQUEST(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.399683-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.399729-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPACK(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d dlpi&lt;br /&gt;
2025-02-12T17:37:07.399772-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.399813-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 15:domain-name, 17:root-path, 26:mtu, 40:nis-domain, &lt;br /&gt;
2025-02-12T17:37:07.399858-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 42:ntp-server&lt;br /&gt;
2025-02-12T17:37:07.399895-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.399940-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  1 option: 53 message-type  5&lt;br /&gt;
2025-02-12T17:37:07.400009-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.400094-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.400135-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.400180-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.400258-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.400296-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.400332-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.828150-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.828287-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 vendor class: Linux ipconfig&lt;br /&gt;
2025-02-12T17:37:07.828337-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPDISCOVER(enp4s0) dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.828389-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.828430-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPOFFER(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.828479-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.828630-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 15:domain-name, 17:root-path, 26:mtu, 28:broadcast, &lt;br /&gt;
2025-02-12T17:37:07.828689-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 40:nis-domain, 119:domain-search, 121:classless-static-route&lt;br /&gt;
2025-02-12T17:37:07.828748-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.828790-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 broadcast response&lt;br /&gt;
2025-02-12T17:37:07.828833-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  1 option: 53 message-type  2&lt;br /&gt;
2025-02-12T17:37:07.828871-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.828921-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.828963-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.829067-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.829159-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829212-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.829252-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.829292-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.829357-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 vendor class: Linux ipconfig&lt;br /&gt;
2025-02-12T17:37:07.829400-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPREQUEST(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.829442-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.829474-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPACK(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d dlpi&lt;br /&gt;
2025-02-12T17:37:07.829513-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.829550-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 15:domain-name, 17:root-path, 26:mtu, 28:broadcast, &lt;br /&gt;
2025-02-12T17:37:07.829625-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 40:nis-domain, 119:domain-search, 121:classless-static-route&lt;br /&gt;
2025-02-12T17:37:07.829665-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829715-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 broadcast response&lt;br /&gt;
2025-02-12T17:37:07.829755-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  1 option: 53 message-type  5&lt;br /&gt;
2025-02-12T17:37:07.829795-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829826-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.829858-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.829890-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.829924-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829976-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.830059-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.904121-08:00 daq13 rpc.mountd[2394]: refused mount request from 192.168.0.3 for /nfsroot/dlpi,vers=3,tcp (/): not exported&lt;br /&gt;
2025-02-12T17:37:08.930059-08:00 daq13 rpc.mountd[2394]: authenticated mount request from 192.168.0.3:945 for /nfsroot/dlpi (/nfsroot/dlpi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dlpi pings, ssh returns &amp;quot;connection refused&amp;quot;&lt;br /&gt;
* we forgot to install and enable ssh on the SD card!!!&lt;br /&gt;
* we forgot to mount &amp;quot;/&amp;quot; read-write, observe log files in /nfsroot/dlpi/var/log should have current times&lt;br /&gt;
&lt;br /&gt;
= post install =&lt;br /&gt;
&lt;br /&gt;
* we forgot to enable ssh when we setup the SD card, enable it by hand:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/dlpi&lt;br /&gt;
cd etc/systemd/system&lt;br /&gt;
rm ./multi-user.target.wants/sshswitch.service&lt;br /&gt;
ln -s /usr/lib/systemd/system/ssh.socket sockets.target.wants/ssh.socket&lt;br /&gt;
ln -s /usr/lib/systemd/system/ssh.socket ssh.service.requires/ssh.socket&lt;br /&gt;
reset dlpi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat ~/.ssh/id_ed25519.pub &amp;gt;&amp;gt; /nfsroot/dlpi/root/.ssh/authorized_keys&lt;br /&gt;
* ssh dlpi should work now&lt;br /&gt;
* as root@dlpi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
apt install ssh&lt;br /&gt;
systemctl enable ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/hostname&lt;br /&gt;
* install missing packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper # keep /etc in git&lt;br /&gt;
apt -y install sysstat # for iostat&lt;br /&gt;
apt -y install git emacs lm-sensors # system&lt;br /&gt;
apt -y install cmake libcurl4-openssl-dev mariadb-client libmariadb-dev libsqlite3-dev # midas&lt;br /&gt;
#apt -y install chromium-browser # arm version of google-chrome&lt;br /&gt;
apt -y install libusb-1.0-0 libusb-1.0-0-dev&lt;br /&gt;
apt -y install i2c-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable unwanted services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable modemmanager&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant&lt;br /&gt;
systemctl disable bluetooth&lt;br /&gt;
systemctl disable avahi-daemon&lt;br /&gt;
systemctl disable triggerhappy&lt;br /&gt;
/bin/rm -v /etc/cron.daily/sysstat /etc/cron.d/sysstat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* remove unwanted packages&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge bash-completion&lt;br /&gt;
apt purge avahi-daemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install git.scripts, see [[Ubuntu#install_git/scripts]]&lt;br /&gt;
* enable /etc/rc.local, see [[Ubuntu#Enable_rc.local]]&lt;br /&gt;
* fix &amp;quot;mkinitramfs: failed to determine device for /&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
edit /etc/initramfs-tools/initramfs.conf&lt;br /&gt;
change &amp;quot;MODULES=dep&amp;quot; to &amp;quot;MODULES=netboot&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== enable i2c ==&lt;br /&gt;
&lt;br /&gt;
* edit /boot/firmware/config.txt, uncomment &amp;quot;dtparam=i2c_arm=on&amp;quot;&lt;br /&gt;
* modprobe i2c-dev&lt;br /&gt;
* i2cdetect 1&lt;br /&gt;
&lt;br /&gt;
== set time zone ==&lt;br /&gt;
&lt;br /&gt;
* TERM=vt100 dpkg-reconfigure tzdata&lt;br /&gt;
&lt;br /&gt;
= Pre-D-12 information =&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
* boot from SD flash, follow stock documention:&lt;br /&gt;
** unzip 2021-10-30-raspios-bullseye-armhf-lite.zip into a .img&lt;br /&gt;
** dd of=/dev/sda if=2021-10-30-raspios-bullseye-armhf-lite.img bs=1024k status=progress&lt;br /&gt;
** boot from flash&lt;br /&gt;
** user pi password raspberry&lt;br /&gt;
** run rasp[i-config to enable US locale and US keyboard&lt;br /&gt;
** ifconfig -a to capture mac address, enter into dhcp, plug ethernet cable&lt;br /&gt;
** apt update; apt upgrade&lt;br /&gt;
** passwd pi change default password&lt;br /&gt;
** systemctl enable ssh; systemctl start ssh&lt;br /&gt;
** login remotely, run the ubuntu (debian 11) installation checklist&lt;br /&gt;
* boot from network&lt;br /&gt;
** TBD&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;lite&amp;quot; image enable graphics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install mate-desktop mate-core mate-themes mate-desktop-environment mate-applets --fix-missing&lt;br /&gt;
apt -y install lightdm lightdm-gtk-greeter&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
systemctl start lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;lite&amp;quot; image missing packages ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git emacs lm-sensors # system&lt;br /&gt;
apt -y install cmake libcurl4-openssl-dev mariadb-client libmariadb-dev libsqlite3-dev # midas&lt;br /&gt;
apt -y install chromium-browser # arm version of google-chrome&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== mount &amp;quot;lite&amp;quot; image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
xz -d 2025-12-04-raspios-trixie-arm64-lite.img.xz&lt;br /&gt;
fdisk -lu 2025-12-04-raspios-trixie-arm64-lite.img&lt;br /&gt;
# Device                                    Boot   Start     End Sectors  Size Id Type&lt;br /&gt;
# 2025-12-04-raspios-trixie-arm64-lite.img1        16384 1064959 1048576  512M  c W95 FAT32 (LBA)&lt;br /&gt;
# 2025-12-04-raspios-trixie-arm64-lite.img2      1064960 5832703 4767744  2.3G 83 Linux&lt;br /&gt;
# specify mount &amp;quot;offset&amp;quot; as fdisk &amp;quot;start&amp;quot; * 512&lt;br /&gt;
mount -o loop,offset=545259520 2025-12-04-raspios-trixie-arm64-lite.img /mnt&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= End =&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Raspbian&amp;diff=8794</id>
		<title>Raspbian</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Raspbian&amp;diff=8794"/>
		<updated>2026-03-26T16:55:20Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* set time zone */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspbian OS =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://www.raspberrypi.org/software/operating-systems/&lt;br /&gt;
&lt;br /&gt;
= Versions =&lt;br /&gt;
&lt;br /&gt;
* buster is debian 10&lt;br /&gt;
* bullseye is debian 11&lt;br /&gt;
* bookworm is debian 12&lt;br /&gt;
&lt;br /&gt;
= install RPi4 from scratch =&lt;br /&gt;
&lt;br /&gt;
* download 2024-11-19-raspios-bookworm-arm64-lite.img.xz&lt;br /&gt;
* cd /daq/daqstore/olchansk/linux/Raspbian/&lt;br /&gt;
* insert 16GB or bigger SD card into /dev/sdX&lt;br /&gt;
* xzcat 2024-11-19-raspios-bookworm-arm64-lite.img.xz | dd of=/dev/sdX bs=1024k status=progress&lt;br /&gt;
* fdisk -l ### to see if it worked&lt;br /&gt;
* eject /dev/sdX&lt;br /&gt;
* insert SD card into RPi4&lt;br /&gt;
* power up&lt;br /&gt;
* observe boot&lt;br /&gt;
* observe ask for language and keyboard layout, select English/US&lt;br /&gt;
* observe ask for create user, use &amp;quot;wheel&amp;quot; and password&lt;br /&gt;
* observe boot to login prompt&lt;br /&gt;
* login as wheel&lt;br /&gt;
* sudo /bin/bash&lt;br /&gt;
* ifconfig eth0 142.90.x.y netmask 255.255.224.0 ### use armdaq01 142.90.121.101&lt;br /&gt;
* route add default gw 142.90.100.18&lt;br /&gt;
* ping 142.90.100.18&lt;br /&gt;
* systemctl restart systemd-timesyncd&lt;br /&gt;
* date ### check date is correct&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* (forgot to enable ssh!!!)&lt;br /&gt;
* apt install ssh&lt;br /&gt;
* systemctl enable ssh&lt;br /&gt;
* rpi-eeprom-update ### check boot loader firmware version, current and available may be different&lt;br /&gt;
* rpi-eeprom-update -a ### prepare firmware update, actual update is done on next boot&lt;br /&gt;
* shutdown -r now ### update firmware and boot new kernel&lt;br /&gt;
* login as wheel&lt;br /&gt;
* rpi-eeprom-update ### check boot loader firmware version, current and available should be same&lt;br /&gt;
* raspi-config ### in advanced options, set boot order to network-first&lt;br /&gt;
* maybe verify the changes took, BOOT_ORDER should read 0xf21 for boot from SD card, if absent, boot from network&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@magpi03:~# vcgencmd bootloader_config&lt;br /&gt;
[all]&lt;br /&gt;
BOOT_UART=0&lt;br /&gt;
WAKE_ON_GPIO=1&lt;br /&gt;
POWER_OFF_ON_HALT=0&lt;br /&gt;
[all]&lt;br /&gt;
BOOT_ORDER=0xf21&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* shutdown -h now&lt;br /&gt;
* power down&lt;br /&gt;
* remove SD card&lt;br /&gt;
* power up&lt;br /&gt;
* observe it&#039;s dhcp requests&lt;br /&gt;
&lt;br /&gt;
= install RPi5 from scratch =&lt;br /&gt;
&lt;br /&gt;
* same as above&lt;br /&gt;
* use 2025-05-13-raspios-bookworm-arm64-lite.img.xz&lt;br /&gt;
* after enabling boot from network, vcgencmd reports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[all]&lt;br /&gt;
BOOT_UART=1&lt;br /&gt;
POWER_OFF_ON_HALT=0&lt;br /&gt;
BOOT_ORDER=0xf461&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= setup network booting =&lt;br /&gt;
&lt;br /&gt;
* setup dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf &lt;br /&gt;
# DNS settings &lt;br /&gt;
port=0 # disable DNS function &lt;br /&gt;
#port=53 # enable DNS function &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp4s0 # DHCP interface &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
log-dhcp &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
#dhcp-ignore=tag:!known &lt;br /&gt;
dhcp-host=dc:a6:32:d5:d9:8d,set:rpi4,set:dlpi,192.168.0.3,dlpi,infinite &lt;br /&gt;
# TFTP settings &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
# RPi4 settings &lt;br /&gt;
dhcp-option-force=tag:dlpi,option:root-path,192.168.0.1:/nfsroot/dlpi,vers=3,tcp,rw&lt;br /&gt;
pxe-service=tag:rpi4,0,&amp;quot;Raspberry Pi Boot&amp;quot; &lt;br /&gt;
 # end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* most important is the &amp;quot;pxe-service&amp;quot; entry to enable RPi4 tftp boot&lt;br /&gt;
* systemctl dnsmasq restart&lt;br /&gt;
* observe RPi4 is doing message type 2 and message type 5&lt;br /&gt;
* followed by requests for files under /tftpboot/eb47cd4d (numbers is the RPi4 serial number)&lt;br /&gt;
* mkdir /nfsroot/dlpi, /nfsroot/dlpi-firmware&lt;br /&gt;
* rsync files from SD card partition 1 (VFAT) to /nfsroot/dlpi-firmware&lt;br /&gt;
* rsync files from SD card partition 2 (ext4) to /nfsroot/dlpi&lt;br /&gt;
* edit /etc/exportfs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dlpi  dlpi(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
/nfsroot/dlpi-firmware  dlpi(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rv&lt;br /&gt;
* ln -s /nfsroot/dlpi-firmware /tftpboot/eb47cd4d&lt;br /&gt;
* edit /nfsroot/dlpi-firmware/cmdline.txt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
console=serial0,115200 console=tty1 ip=dhcp root=/dev/nfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /nfsroot/dlpi/etc/fstab, comment out mount of &amp;quot;/&amp;quot; and &amp;quot;/boot/firmware&amp;quot; add NFS mounts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.1:/nfsroot/dlpi / nfs defaults&lt;br /&gt;
192.168.0.1:/nfsroot/dlpi-firmware /boot/firmware nfs defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* alternatively, combine dlpi-firmware into /nfsroot/dlpi/boot/firmware, ln -s ln -s /nfsroot/dlpi/boot/firmware /tftpboot/db79fb39&lt;br /&gt;
* cycle power RPi4&lt;br /&gt;
* observe /var/log/syslog sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2025-02-12T17:36:54.284833-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.285598-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 vendor class: PXEClient:Arch:00000:UNDI:002001&lt;br /&gt;
2025-02-12T17:36:54.285646-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPDISCOVER(enp4s0) dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:36:54.285693-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:36:54.285753-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPOFFER(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:36:54.285850-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 requested options: 1:netmask, 3:router, 43:vendor-encap, 60:vendor-class, &lt;br /&gt;
2025-02-12T17:36:54.285948-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 requested options: 66:tftp-server, 67:bootfile-name, 128, 129, &lt;br /&gt;
2025-02-12T17:36:54.286020-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 requested options: 130, 131, 132, 133, 134, 135&lt;br /&gt;
2025-02-12T17:36:54.286128-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.286214-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  1 option: 53 message-type  2&lt;br /&gt;
2025-02-12T17:36:54.286267-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.286330-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:36:54.286381-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.286461-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:36:54.286557-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.286616-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:36:54.286690-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  9 option: 60 vendor-class  50:58:45:43:6c:69:65:6e:74&lt;br /&gt;
2025-02-12T17:36:54.286758-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 17 option: 97 client-machine-id  00:34:69:50:52:14:31:d0:00:32:d5:d9:8d:4d...&lt;br /&gt;
2025-02-12T17:36:54.286807-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 32 option: 43 vendor-encap  06:01:03:0a:04:00:50:58:45:09:14:00:00:11...&lt;br /&gt;
2025-02-12T17:36:54.286856-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.286906-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 vendor class: PXEClient:Arch:00000:UNDI:002001&lt;br /&gt;
2025-02-12T17:36:54.287008-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPREQUEST(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:36:54.287137-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:36:54.287189-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPACK(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d dlpi&lt;br /&gt;
2025-02-12T17:36:54.287241-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.287316-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  1 option: 53 message-type  5&lt;br /&gt;
2025-02-12T17:36:54.287381-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.287430-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:36:54.287498-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.287588-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:36:54.287650-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.287707-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:36:54.287788-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:36:54.287922-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.288098-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/start4.elf to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.288175-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.288328-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/pieeprom.sig to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.466481-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/pieeprom.upd to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.521733-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recover4.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.522145-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.501376-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/start4.elf to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.552921-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/fixup4.dat to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.785337-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.785969-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.786047-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.786300-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.787049-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/dt-blob.bin not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.822865-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.823335-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.823397-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.823593-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.599954-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/bootcfg.txt not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.624989-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery8.img not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625545-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625605-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625921-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625993-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626224-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626318-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626556-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626628-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626781-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626818-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.591162-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.607851-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.607926-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/bcm2711-rpi-4-b.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.615129-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/bcm2711-rpi-4-b.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.629371-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.629455-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/overlays/overlay_map.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.630176-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/overlays/overlay_map.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.654215-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.654286-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.654557-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.660372-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.660459-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/overlays/vc4-kms-v3d-pi4.dtbo to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.660958-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/overlays/vc4-kms-v3d-pi4.dtbo to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.887880-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.887973-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/cmdline.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.888037-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/cmdline.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:58.012839-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/armstub8-gic.bin not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:58.013283-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:58.013394-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:59.184059-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:37:07.391950-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.392121-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPDISCOVER(enp4s0) dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.392231-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.392276-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPOFFER(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.392318-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.392375-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 15:domain-name, 17:root-path, 26:mtu, 40:nis-domain, &lt;br /&gt;
2025-02-12T17:37:07.392449-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 42:ntp-server&lt;br /&gt;
2025-02-12T17:37:07.392495-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.392551-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  1 option: 53 message-type  2&lt;br /&gt;
2025-02-12T17:37:07.392655-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.392722-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.392803-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.392843-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.392881-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.392927-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.392963-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.399482-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.399553-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 client provides name: dlpi&lt;br /&gt;
2025-02-12T17:37:07.399599-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPREQUEST(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.399683-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.399729-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPACK(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d dlpi&lt;br /&gt;
2025-02-12T17:37:07.399772-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.399813-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 15:domain-name, 17:root-path, 26:mtu, 40:nis-domain, &lt;br /&gt;
2025-02-12T17:37:07.399858-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 42:ntp-server&lt;br /&gt;
2025-02-12T17:37:07.399895-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.399940-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  1 option: 53 message-type  5&lt;br /&gt;
2025-02-12T17:37:07.400009-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.400094-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.400135-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.400180-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.400258-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.400296-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.400332-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.828150-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.828287-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 vendor class: Linux ipconfig&lt;br /&gt;
2025-02-12T17:37:07.828337-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPDISCOVER(enp4s0) dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.828389-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.828430-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPOFFER(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.828479-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.828630-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 15:domain-name, 17:root-path, 26:mtu, 28:broadcast, &lt;br /&gt;
2025-02-12T17:37:07.828689-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 40:nis-domain, 119:domain-search, 121:classless-static-route&lt;br /&gt;
2025-02-12T17:37:07.828748-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.828790-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 broadcast response&lt;br /&gt;
2025-02-12T17:37:07.828833-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  1 option: 53 message-type  2&lt;br /&gt;
2025-02-12T17:37:07.828871-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.828921-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.828963-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.829067-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.829159-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829212-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.829252-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.829292-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.829357-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 vendor class: Linux ipconfig&lt;br /&gt;
2025-02-12T17:37:07.829400-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPREQUEST(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.829442-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.829474-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPACK(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d dlpi&lt;br /&gt;
2025-02-12T17:37:07.829513-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.829550-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 15:domain-name, 17:root-path, 26:mtu, 28:broadcast, &lt;br /&gt;
2025-02-12T17:37:07.829625-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 40:nis-domain, 119:domain-search, 121:classless-static-route&lt;br /&gt;
2025-02-12T17:37:07.829665-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829715-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 broadcast response&lt;br /&gt;
2025-02-12T17:37:07.829755-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  1 option: 53 message-type  5&lt;br /&gt;
2025-02-12T17:37:07.829795-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829826-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.829858-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.829890-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.829924-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829976-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.830059-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.904121-08:00 daq13 rpc.mountd[2394]: refused mount request from 192.168.0.3 for /nfsroot/dlpi,vers=3,tcp (/): not exported&lt;br /&gt;
2025-02-12T17:37:08.930059-08:00 daq13 rpc.mountd[2394]: authenticated mount request from 192.168.0.3:945 for /nfsroot/dlpi (/nfsroot/dlpi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dlpi pings, ssh returns &amp;quot;connection refused&amp;quot;&lt;br /&gt;
* we forgot to install and enable ssh on the SD card!!!&lt;br /&gt;
* we forgot to mount &amp;quot;/&amp;quot; read-write, observe log files in /nfsroot/dlpi/var/log should have current times&lt;br /&gt;
&lt;br /&gt;
= post install =&lt;br /&gt;
&lt;br /&gt;
* we forgot to enable ssh when we setup the SD card, enable it by hand:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/dlpi&lt;br /&gt;
cd etc/systemd/system&lt;br /&gt;
rm ./multi-user.target.wants/sshswitch.service&lt;br /&gt;
ln -s /usr/lib/systemd/system/ssh.socket sockets.target.wants/ssh.socket&lt;br /&gt;
ln -s /usr/lib/systemd/system/ssh.socket ssh.service.requires/ssh.socket&lt;br /&gt;
reset dlpi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat ~/.ssh/id_ed25519.pub &amp;gt;&amp;gt; /nfsroot/dlpi/root/.ssh/authorized_keys&lt;br /&gt;
* ssh dlpi should work now&lt;br /&gt;
* as root@dlpi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
apt install ssh&lt;br /&gt;
systemctl enable ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/hostname&lt;br /&gt;
* install missing packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper # keep /etc in git&lt;br /&gt;
apt -y install sysstat # for iostat&lt;br /&gt;
apt -y install git emacs lm-sensors # system&lt;br /&gt;
apt -y install cmake libcurl4-openssl-dev mariadb-client libmariadb-dev libsqlite3-dev # midas&lt;br /&gt;
#apt -y install chromium-browser # arm version of google-chrome&lt;br /&gt;
apt -y install libusb-1.0-0 libusb-1.0-0-dev&lt;br /&gt;
apt -y install i2c-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable unwanted services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable modemmanager&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant&lt;br /&gt;
systemctl disable bluetooth&lt;br /&gt;
systemctl disable avahi-daemon&lt;br /&gt;
systemctl disable triggerhappy&lt;br /&gt;
/bin/rm -v /etc/cron.daily/sysstat /etc/cron.d/sysstat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* remove unwanted packages&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge bash-completion&lt;br /&gt;
apt purge avahi-daemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install git.scripts, see [[Ubuntu#install_git/scripts]]&lt;br /&gt;
* enable /etc/rc.local, see [[Ubuntu#Enable_rc.local]]&lt;br /&gt;
* fix &amp;quot;mkinitramfs: failed to determine device for /&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
edit /etc/initramfs-tools/initramfs.conf&lt;br /&gt;
change &amp;quot;MODULES=dep&amp;quot; to &amp;quot;MODULES=netboot&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== enable i2c ==&lt;br /&gt;
&lt;br /&gt;
* edit /boot/firmware/config.txt, uncomment &amp;quot;dtparam=i2c_arm=on&amp;quot;&lt;br /&gt;
* modprobe i2c-dev&lt;br /&gt;
* i2cdetect 1&lt;br /&gt;
&lt;br /&gt;
== set time zone ==&lt;br /&gt;
&lt;br /&gt;
* TERM=vt100 dpkg-reconfigure tzdata&lt;br /&gt;
&lt;br /&gt;
= Pre-D-12 information =&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
* boot from SD flash, follow stock documention:&lt;br /&gt;
** unzip 2021-10-30-raspios-bullseye-armhf-lite.zip into a .img&lt;br /&gt;
** dd of=/dev/sda if=2021-10-30-raspios-bullseye-armhf-lite.img bs=1024k status=progress&lt;br /&gt;
** boot from flash&lt;br /&gt;
** user pi password raspberry&lt;br /&gt;
** run rasp[i-config to enable US locale and US keyboard&lt;br /&gt;
** ifconfig -a to capture mac address, enter into dhcp, plug ethernet cable&lt;br /&gt;
** apt update; apt upgrade&lt;br /&gt;
** passwd pi change default password&lt;br /&gt;
** systemctl enable ssh; systemctl start ssh&lt;br /&gt;
** login remotely, run the ubuntu (debian 11) installation checklist&lt;br /&gt;
* boot from network&lt;br /&gt;
** TBD&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;lite&amp;quot; image enable graphics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install mate-desktop mate-core mate-themes mate-desktop-environment mate-applets --fix-missing&lt;br /&gt;
apt -y install lightdm lightdm-gtk-greeter&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
systemctl start lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;lite&amp;quot; image missing packages ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git emacs lm-sensors # system&lt;br /&gt;
apt -y install cmake libcurl4-openssl-dev mariadb-client libmariadb-dev libsqlite3-dev # midas&lt;br /&gt;
apt -y install chromium-browser # arm version of google-chrome&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= End =&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Raspbian&amp;diff=8793</id>
		<title>Raspbian</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Raspbian&amp;diff=8793"/>
		<updated>2026-03-26T16:48:47Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* enable i2c */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Raspbian OS =&lt;br /&gt;
&lt;br /&gt;
= Links =&lt;br /&gt;
&lt;br /&gt;
* https://www.raspberrypi.org/software/operating-systems/&lt;br /&gt;
&lt;br /&gt;
= Versions =&lt;br /&gt;
&lt;br /&gt;
* buster is debian 10&lt;br /&gt;
* bullseye is debian 11&lt;br /&gt;
* bookworm is debian 12&lt;br /&gt;
&lt;br /&gt;
= install RPi4 from scratch =&lt;br /&gt;
&lt;br /&gt;
* download 2024-11-19-raspios-bookworm-arm64-lite.img.xz&lt;br /&gt;
* cd /daq/daqstore/olchansk/linux/Raspbian/&lt;br /&gt;
* insert 16GB or bigger SD card into /dev/sdX&lt;br /&gt;
* xzcat 2024-11-19-raspios-bookworm-arm64-lite.img.xz | dd of=/dev/sdX bs=1024k status=progress&lt;br /&gt;
* fdisk -l ### to see if it worked&lt;br /&gt;
* eject /dev/sdX&lt;br /&gt;
* insert SD card into RPi4&lt;br /&gt;
* power up&lt;br /&gt;
* observe boot&lt;br /&gt;
* observe ask for language and keyboard layout, select English/US&lt;br /&gt;
* observe ask for create user, use &amp;quot;wheel&amp;quot; and password&lt;br /&gt;
* observe boot to login prompt&lt;br /&gt;
* login as wheel&lt;br /&gt;
* sudo /bin/bash&lt;br /&gt;
* ifconfig eth0 142.90.x.y netmask 255.255.224.0 ### use armdaq01 142.90.121.101&lt;br /&gt;
* route add default gw 142.90.100.18&lt;br /&gt;
* ping 142.90.100.18&lt;br /&gt;
* systemctl restart systemd-timesyncd&lt;br /&gt;
* date ### check date is correct&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* (forgot to enable ssh!!!)&lt;br /&gt;
* apt install ssh&lt;br /&gt;
* systemctl enable ssh&lt;br /&gt;
* rpi-eeprom-update ### check boot loader firmware version, current and available may be different&lt;br /&gt;
* rpi-eeprom-update -a ### prepare firmware update, actual update is done on next boot&lt;br /&gt;
* shutdown -r now ### update firmware and boot new kernel&lt;br /&gt;
* login as wheel&lt;br /&gt;
* rpi-eeprom-update ### check boot loader firmware version, current and available should be same&lt;br /&gt;
* raspi-config ### in advanced options, set boot order to network-first&lt;br /&gt;
* maybe verify the changes took, BOOT_ORDER should read 0xf21 for boot from SD card, if absent, boot from network&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@magpi03:~# vcgencmd bootloader_config&lt;br /&gt;
[all]&lt;br /&gt;
BOOT_UART=0&lt;br /&gt;
WAKE_ON_GPIO=1&lt;br /&gt;
POWER_OFF_ON_HALT=0&lt;br /&gt;
[all]&lt;br /&gt;
BOOT_ORDER=0xf21&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* shutdown -h now&lt;br /&gt;
* power down&lt;br /&gt;
* remove SD card&lt;br /&gt;
* power up&lt;br /&gt;
* observe it&#039;s dhcp requests&lt;br /&gt;
&lt;br /&gt;
= install RPi5 from scratch =&lt;br /&gt;
&lt;br /&gt;
* same as above&lt;br /&gt;
* use 2025-05-13-raspios-bookworm-arm64-lite.img.xz&lt;br /&gt;
* after enabling boot from network, vcgencmd reports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[all]&lt;br /&gt;
BOOT_UART=1&lt;br /&gt;
POWER_OFF_ON_HALT=0&lt;br /&gt;
BOOT_ORDER=0xf461&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= setup network booting =&lt;br /&gt;
&lt;br /&gt;
* setup dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf &lt;br /&gt;
# DNS settings &lt;br /&gt;
port=0 # disable DNS function &lt;br /&gt;
#port=53 # enable DNS function &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp4s0 # DHCP interface &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
log-dhcp &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
#dhcp-ignore=tag:!known &lt;br /&gt;
dhcp-host=dc:a6:32:d5:d9:8d,set:rpi4,set:dlpi,192.168.0.3,dlpi,infinite &lt;br /&gt;
# TFTP settings &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
# RPi4 settings &lt;br /&gt;
dhcp-option-force=tag:dlpi,option:root-path,192.168.0.1:/nfsroot/dlpi,vers=3,tcp,rw&lt;br /&gt;
pxe-service=tag:rpi4,0,&amp;quot;Raspberry Pi Boot&amp;quot; &lt;br /&gt;
 # end &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* most important is the &amp;quot;pxe-service&amp;quot; entry to enable RPi4 tftp boot&lt;br /&gt;
* systemctl dnsmasq restart&lt;br /&gt;
* observe RPi4 is doing message type 2 and message type 5&lt;br /&gt;
* followed by requests for files under /tftpboot/eb47cd4d (numbers is the RPi4 serial number)&lt;br /&gt;
* mkdir /nfsroot/dlpi, /nfsroot/dlpi-firmware&lt;br /&gt;
* rsync files from SD card partition 1 (VFAT) to /nfsroot/dlpi-firmware&lt;br /&gt;
* rsync files from SD card partition 2 (ext4) to /nfsroot/dlpi&lt;br /&gt;
* edit /etc/exportfs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dlpi  dlpi(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
/nfsroot/dlpi-firmware  dlpi(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rv&lt;br /&gt;
* ln -s /nfsroot/dlpi-firmware /tftpboot/eb47cd4d&lt;br /&gt;
* edit /nfsroot/dlpi-firmware/cmdline.txt&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
console=serial0,115200 console=tty1 ip=dhcp root=/dev/nfs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /nfsroot/dlpi/etc/fstab, comment out mount of &amp;quot;/&amp;quot; and &amp;quot;/boot/firmware&amp;quot; add NFS mounts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.1:/nfsroot/dlpi / nfs defaults&lt;br /&gt;
192.168.0.1:/nfsroot/dlpi-firmware /boot/firmware nfs defaults&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* alternatively, combine dlpi-firmware into /nfsroot/dlpi/boot/firmware, ln -s ln -s /nfsroot/dlpi/boot/firmware /tftpboot/db79fb39&lt;br /&gt;
* cycle power RPi4&lt;br /&gt;
* observe /var/log/syslog sequence:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
2025-02-12T17:36:54.284833-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.285598-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 vendor class: PXEClient:Arch:00000:UNDI:002001&lt;br /&gt;
2025-02-12T17:36:54.285646-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPDISCOVER(enp4s0) dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:36:54.285693-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:36:54.285753-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPOFFER(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:36:54.285850-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 requested options: 1:netmask, 3:router, 43:vendor-encap, 60:vendor-class, &lt;br /&gt;
2025-02-12T17:36:54.285948-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 requested options: 66:tftp-server, 67:bootfile-name, 128, 129, &lt;br /&gt;
2025-02-12T17:36:54.286020-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 requested options: 130, 131, 132, 133, 134, 135&lt;br /&gt;
2025-02-12T17:36:54.286128-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.286214-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  1 option: 53 message-type  2&lt;br /&gt;
2025-02-12T17:36:54.286267-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.286330-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:36:54.286381-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.286461-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:36:54.286557-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.286616-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:36:54.286690-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  9 option: 60 vendor-class  50:58:45:43:6c:69:65:6e:74&lt;br /&gt;
2025-02-12T17:36:54.286758-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 17 option: 97 client-machine-id  00:34:69:50:52:14:31:d0:00:32:d5:d9:8d:4d...&lt;br /&gt;
2025-02-12T17:36:54.286807-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 32 option: 43 vendor-encap  06:01:03:0a:04:00:50:58:45:09:14:00:00:11...&lt;br /&gt;
2025-02-12T17:36:54.286856-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.286906-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 vendor class: PXEClient:Arch:00000:UNDI:002001&lt;br /&gt;
2025-02-12T17:36:54.287008-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPREQUEST(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:36:54.287137-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:36:54.287189-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 DHCPACK(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d dlpi&lt;br /&gt;
2025-02-12T17:36:54.287241-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.287316-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  1 option: 53 message-type  5&lt;br /&gt;
2025-02-12T17:36:54.287381-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.287430-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:36:54.287498-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:36:54.287588-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:36:54.287650-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:36:54.287707-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:36:54.287788-08:00 daq13 dnsmasq-dhcp[2850406]: 3677640978 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:36:54.287922-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.288098-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/start4.elf to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.288175-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.288328-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/pieeprom.sig to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.466481-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/pieeprom.upd to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.521733-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recover4.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:54.522145-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.501376-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/start4.elf to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.552921-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/fixup4.dat to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.785337-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.785969-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.786047-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.786300-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.787049-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/dt-blob.bin not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.822865-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery.elf not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.823335-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.823397-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:55.823593-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.599954-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/bootcfg.txt not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.624989-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/recovery8.img not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625545-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625605-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625921-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.625993-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626224-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626318-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626556-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626628-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626781-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:56.626818-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.591162-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/initramfs8 to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.607851-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.607926-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/bcm2711-rpi-4-b.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.615129-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/bcm2711-rpi-4-b.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.629371-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.629455-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/overlays/overlay_map.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.630176-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/overlays/overlay_map.dtb to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.654215-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.654286-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.654557-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/config.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.660372-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.660459-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/overlays/vc4-kms-v3d-pi4.dtbo to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.660958-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/overlays/vc4-kms-v3d-pi4.dtbo to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.887880-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.887973-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/cmdline.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:57.888037-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/cmdline.txt to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:58.012839-08:00 daq13 dnsmasq-tftp[2850406]: file /tftpboot/eb47cd4d/armstub8-gic.bin not found for 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:58.013283-08:00 daq13 dnsmasq-tftp[2850406]: error 0 Early terminate received from 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:58.013394-08:00 daq13 dnsmasq-tftp[2850406]: failed sending /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:36:59.184059-08:00 daq13 dnsmasq-tftp[2850406]: sent /tftpboot/eb47cd4d/kernel8.img to 192.168.0.3&lt;br /&gt;
2025-02-12T17:37:07.391950-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.392121-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPDISCOVER(enp4s0) dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.392231-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.392276-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPOFFER(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.392318-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.392375-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 15:domain-name, 17:root-path, 26:mtu, 40:nis-domain, &lt;br /&gt;
2025-02-12T17:37:07.392449-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 42:ntp-server&lt;br /&gt;
2025-02-12T17:37:07.392495-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.392551-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  1 option: 53 message-type  2&lt;br /&gt;
2025-02-12T17:37:07.392655-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.392722-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.392803-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.392843-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.392881-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.392927-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.392963-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.399482-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.399553-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 client provides name: dlpi&lt;br /&gt;
2025-02-12T17:37:07.399599-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPREQUEST(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.399683-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.399729-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 DHCPACK(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d dlpi&lt;br /&gt;
2025-02-12T17:37:07.399772-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.399813-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 15:domain-name, 17:root-path, 26:mtu, 40:nis-domain, &lt;br /&gt;
2025-02-12T17:37:07.399858-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 requested options: 42:ntp-server&lt;br /&gt;
2025-02-12T17:37:07.399895-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.399940-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  1 option: 53 message-type  5&lt;br /&gt;
2025-02-12T17:37:07.400009-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.400094-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.400135-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.400180-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.400258-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.400296-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.400332-08:00 daq13 dnsmasq-dhcp[2850406]: 1565263519 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.828150-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.828287-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 vendor class: Linux ipconfig&lt;br /&gt;
2025-02-12T17:37:07.828337-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPDISCOVER(enp4s0) dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.828389-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.828430-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPOFFER(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.828479-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.828630-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 15:domain-name, 17:root-path, 26:mtu, 28:broadcast, &lt;br /&gt;
2025-02-12T17:37:07.828689-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 40:nis-domain, 119:domain-search, 121:classless-static-route&lt;br /&gt;
2025-02-12T17:37:07.828748-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.828790-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 broadcast response&lt;br /&gt;
2025-02-12T17:37:07.828833-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  1 option: 53 message-type  2&lt;br /&gt;
2025-02-12T17:37:07.828871-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.828921-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.828963-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.829067-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.829159-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829212-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.829252-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.829292-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.829357-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 vendor class: Linux ipconfig&lt;br /&gt;
2025-02-12T17:37:07.829400-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPREQUEST(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d &lt;br /&gt;
2025-02-12T17:37:07.829442-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 tags: rpi4, dlpi, known, enp4s0&lt;br /&gt;
2025-02-12T17:37:07.829474-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 DHCPACK(enp4s0) 192.168.0.3 dc:a6:32:d5:d9:8d dlpi&lt;br /&gt;
2025-02-12T17:37:07.829513-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 1:netmask, 3:router, 6:dns-server, 12:hostname, &lt;br /&gt;
2025-02-12T17:37:07.829550-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 15:domain-name, 17:root-path, 26:mtu, 28:broadcast, &lt;br /&gt;
2025-02-12T17:37:07.829625-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 requested options: 40:nis-domain, 119:domain-search, 121:classless-static-route&lt;br /&gt;
2025-02-12T17:37:07.829665-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 next server: 192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829715-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 broadcast response&lt;br /&gt;
2025-02-12T17:37:07.829755-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  1 option: 53 message-type  5&lt;br /&gt;
2025-02-12T17:37:07.829795-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 54 server-identifier  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829826-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
2025-02-12T17:37:07.829858-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
2025-02-12T17:37:07.829890-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
2025-02-12T17:37:07.829924-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option:  3 router  192.168.0.1&lt;br /&gt;
2025-02-12T17:37:07.829976-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size:  4 option: 12 hostname  dlpi&lt;br /&gt;
2025-02-12T17:37:07.830059-08:00 daq13 dnsmasq-dhcp[2850406]: 4119634558 sent size: 36 option: 17 root-path  192.168.0.1:/nfsroot/dlpi,vers=3,tcp&lt;br /&gt;
2025-02-12T17:37:07.904121-08:00 daq13 rpc.mountd[2394]: refused mount request from 192.168.0.3 for /nfsroot/dlpi,vers=3,tcp (/): not exported&lt;br /&gt;
2025-02-12T17:37:08.930059-08:00 daq13 rpc.mountd[2394]: authenticated mount request from 192.168.0.3:945 for /nfsroot/dlpi (/nfsroot/dlpi)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dlpi pings, ssh returns &amp;quot;connection refused&amp;quot;&lt;br /&gt;
* we forgot to install and enable ssh on the SD card!!!&lt;br /&gt;
* we forgot to mount &amp;quot;/&amp;quot; read-write, observe log files in /nfsroot/dlpi/var/log should have current times&lt;br /&gt;
&lt;br /&gt;
= post install =&lt;br /&gt;
&lt;br /&gt;
* we forgot to enable ssh when we setup the SD card, enable it by hand:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/dlpi&lt;br /&gt;
cd etc/systemd/system&lt;br /&gt;
rm ./multi-user.target.wants/sshswitch.service&lt;br /&gt;
ln -s /usr/lib/systemd/system/ssh.socket sockets.target.wants/ssh.socket&lt;br /&gt;
ln -s /usr/lib/systemd/system/ssh.socket ssh.service.requires/ssh.socket&lt;br /&gt;
reset dlpi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cat ~/.ssh/id_ed25519.pub &amp;gt;&amp;gt; /nfsroot/dlpi/root/.ssh/authorized_keys&lt;br /&gt;
* ssh dlpi should work now&lt;br /&gt;
* as root@dlpi&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
apt install ssh&lt;br /&gt;
systemctl enable ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/hostname&lt;br /&gt;
* install missing packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper # keep /etc in git&lt;br /&gt;
apt -y install sysstat # for iostat&lt;br /&gt;
apt -y install git emacs lm-sensors # system&lt;br /&gt;
apt -y install cmake libcurl4-openssl-dev mariadb-client libmariadb-dev libsqlite3-dev # midas&lt;br /&gt;
#apt -y install chromium-browser # arm version of google-chrome&lt;br /&gt;
apt -y install libusb-1.0-0 libusb-1.0-0-dev&lt;br /&gt;
apt -y install i2c-tools&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable unwanted services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable modemmanager&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant&lt;br /&gt;
systemctl disable bluetooth&lt;br /&gt;
systemctl disable avahi-daemon&lt;br /&gt;
systemctl disable triggerhappy&lt;br /&gt;
/bin/rm -v /etc/cron.daily/sysstat /etc/cron.d/sysstat&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* remove unwanted packages&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge bash-completion&lt;br /&gt;
apt purge avahi-daemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install git.scripts, see [[Ubuntu#install_git/scripts]]&lt;br /&gt;
* enable /etc/rc.local, see [[Ubuntu#Enable_rc.local]]&lt;br /&gt;
* fix &amp;quot;mkinitramfs: failed to determine device for /&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
edit /etc/initramfs-tools/initramfs.conf&lt;br /&gt;
change &amp;quot;MODULES=dep&amp;quot; to &amp;quot;MODULES=netboot&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== enable i2c ==&lt;br /&gt;
&lt;br /&gt;
* edit /boot/firmware/config.txt, uncomment &amp;quot;dtparam=i2c_arm=on&amp;quot;&lt;br /&gt;
* modprobe i2c-dev&lt;br /&gt;
* i2cdetect 1&lt;br /&gt;
&lt;br /&gt;
== set time zone ==&lt;br /&gt;
&lt;br /&gt;
* dpkg-reconfigure tzdata&lt;br /&gt;
&lt;br /&gt;
= Pre-D-12 information =&lt;br /&gt;
&lt;br /&gt;
== Install ==&lt;br /&gt;
&lt;br /&gt;
* boot from SD flash, follow stock documention:&lt;br /&gt;
** unzip 2021-10-30-raspios-bullseye-armhf-lite.zip into a .img&lt;br /&gt;
** dd of=/dev/sda if=2021-10-30-raspios-bullseye-armhf-lite.img bs=1024k status=progress&lt;br /&gt;
** boot from flash&lt;br /&gt;
** user pi password raspberry&lt;br /&gt;
** run rasp[i-config to enable US locale and US keyboard&lt;br /&gt;
** ifconfig -a to capture mac address, enter into dhcp, plug ethernet cable&lt;br /&gt;
** apt update; apt upgrade&lt;br /&gt;
** passwd pi change default password&lt;br /&gt;
** systemctl enable ssh; systemctl start ssh&lt;br /&gt;
** login remotely, run the ubuntu (debian 11) installation checklist&lt;br /&gt;
* boot from network&lt;br /&gt;
** TBD&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;lite&amp;quot; image enable graphics ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install mate-desktop mate-core mate-themes mate-desktop-environment mate-applets --fix-missing&lt;br /&gt;
apt -y install lightdm lightdm-gtk-greeter&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
systemctl start lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== &amp;quot;lite&amp;quot; image missing packages ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git emacs lm-sensors # system&lt;br /&gt;
apt -y install cmake libcurl4-openssl-dev mariadb-client libmariadb-dev libsqlite3-dev # midas&lt;br /&gt;
apt -y install chromium-browser # arm version of google-chrome&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= End =&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8792</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8792"/>
		<updated>2026-03-26T16:24:41Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Ubuntu-24 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
NOTE: do this only if booted into the latest linux kernel - compare &amp;quot;uname -a&amp;quot; with &amp;quot;ls -l /boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-22 ==&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-24 ==&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-aarch64-linux-gnu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-g++ -c -o xvcserver_cdm.o -O2 -g -Wall -Wuninitialized -std=c++20 xvcserver_cdm.cxx &lt;br /&gt;
aarch64-linux-gnu-g++ -o xvcserver_cdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 xvcserver_cdm.o -pthread -lrt -lutil -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 24.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install gcc-i686-linux-gnu&lt;br /&gt;
apt install g++-i686-linux-gnu&lt;br /&gt;
apt install libstdc++-13-dev:i386&lt;br /&gt;
apt install lib32z1 lib32z1-dev&lt;br /&gt;
i686-linux-gnu-gcc -o ttcp.i386 ttcp.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* executables cross-build on Ubuntu-24 will NOT run on 32-bit Debian-12 (GLIBC mismatch, static executables maybe work)&lt;br /&gt;
* executables cross-build on Ubuntu-24 run on 32-bit Debian-13&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8791</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8791"/>
		<updated>2026-03-26T16:22:27Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* ARM64 cross-compiler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
NOTE: do this only if booted into the latest linux kernel - compare &amp;quot;uname -a&amp;quot; with &amp;quot;ls -l /boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-22 ==&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-24 ==&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-aarch64-linux-gnu&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 24.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install gcc-i686-linux-gnu&lt;br /&gt;
apt install g++-i686-linux-gnu&lt;br /&gt;
apt install libstdc++-13-dev:i386&lt;br /&gt;
apt install lib32z1 lib32z1-dev&lt;br /&gt;
i686-linux-gnu-gcc -o ttcp.i386 ttcp.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* executables cross-build on Ubuntu-24 will NOT run on 32-bit Debian-12 (GLIBC mismatch, static executables maybe work)&lt;br /&gt;
* executables cross-build on Ubuntu-24 run on 32-bit Debian-13&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8790</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8790"/>
		<updated>2026-03-26T16:20:58Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* 32-bit intel cross-compiler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
NOTE: do this only if booted into the latest linux kernel - compare &amp;quot;uname -a&amp;quot; with &amp;quot;ls -l /boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
== Ubuntu 24.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install gcc-i686-linux-gnu&lt;br /&gt;
apt install g++-i686-linux-gnu&lt;br /&gt;
apt install libstdc++-13-dev:i386&lt;br /&gt;
apt install lib32z1 lib32z1-dev&lt;br /&gt;
i686-linux-gnu-gcc -o ttcp.i386 ttcp.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* executables cross-build on Ubuntu-24 will NOT run on 32-bit Debian-12 (GLIBC mismatch, static executables maybe work)&lt;br /&gt;
* executables cross-build on Ubuntu-24 run on 32-bit Debian-13&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8789</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8789"/>
		<updated>2026-03-25T23:38:10Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* EFI boot using syslinux */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
NOTE: do this only if booted into the latest linux kernel - compare &amp;quot;uname -a&amp;quot; with &amp;quot;ls -l /boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install gcc-i686-linux-gnu&lt;br /&gt;
apt install g++-i686-linux-gnu&lt;br /&gt;
apt install libstdc++-13-dev:i386&lt;br /&gt;
apt install lib32z1 lib32z1-dev&lt;br /&gt;
i686-linux-gnu-gcc -o ttcp.i386 ttcp.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* executables cross-build on Ubuntu-24 will NOT run on 32-bit Debian-12 (GLIBC mismatch, static executables maybe work)&lt;br /&gt;
* executables cross-build on Ubuntu-24 run on 32-bit Debian-13&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8787</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8787"/>
		<updated>2026-03-20T22:14:38Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* 32-bit intel cross-compiler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
NOTE: do this only if booted into the latest linux kernel - compare &amp;quot;uname -a&amp;quot; with &amp;quot;ls -l /boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install gcc-i686-linux-gnu&lt;br /&gt;
apt install g++-i686-linux-gnu&lt;br /&gt;
apt install libstdc++-13-dev:i386&lt;br /&gt;
i686-linux-gnu-gcc -o ttcp.i386 ttcp.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* executables cross-build on Ubuntu-24 will NOT run on 32-bit Debian-12 (GLIBC mismatch, static executables maybe work)&lt;br /&gt;
* executables cross-build on Ubuntu-24 run on 32-bit Debian-13&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022.nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8786</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8786"/>
		<updated>2026-03-20T22:13:17Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* 32-bit intel cross-compiler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
NOTE: do this only if booted into the latest linux kernel - compare &amp;quot;uname -a&amp;quot; with &amp;quot;ls -l /boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install gcc-i686-linux-gnu&lt;br /&gt;
apt install g++-i686-linux-gnu&lt;br /&gt;
apt install libstdc++-13-dev:i386&lt;br /&gt;
i686-linux-gnu-gcc -o ttcp.i386 ttcp.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022.nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8785</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8785"/>
		<updated>2026-03-20T21:56:30Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* 32-bit intel cross-compiler */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
NOTE: do this only if booted into the latest linux kernel - compare &amp;quot;uname -a&amp;quot; with &amp;quot;ls -l /boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
Ubuntu 24.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-13-dev:i386&lt;br /&gt;
&lt;br /&gt;
gcc -m32 -o ttcp.i386 ttcp.c&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022.nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8784</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8784"/>
		<updated>2026-03-20T21:37:14Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Remove obsolete packages */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
NOTE: do this only if booted into the latest linux kernel - compare &amp;quot;uname -a&amp;quot; with &amp;quot;ls -l /boot&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022.nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8783</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8783"/>
		<updated>2026-03-20T21:21:17Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* 32-bit VME processor Debian 11 to 12 */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 to 13 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ trixie main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022.nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8782</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8782"/>
		<updated>2026-03-20T21:15:10Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Cleanup residual configs */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
Do &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to see a list of installed snaps. Use &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove &amp;lt;item&amp;gt; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to remove each. You will need to remove snapd last. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop snapd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
apt purge snapd&lt;br /&gt;
rm -rf ~/snap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;On the main computer only! (daq00, dsdaqgw, etc)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
killall Xorg # restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
note: DF - on U24 this may re-install snap&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Disable welcome message on ssh == &lt;br /&gt;
&lt;br /&gt;
On ssh, there is a lengthy welcome message. To disable: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/ssh/sshd_config&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ensure that the file reads &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
PrintMod no&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Then, &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vim /etc/pam.d/sshd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
comment out the lines: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
session    optional     pam_motd.so  motd=/run/motd.dynamic&lt;br /&gt;
session    optional     pam_motd.so noupdate&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module and new configurations:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update # update package list&lt;br /&gt;
apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove obsolete packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~o&#039;&lt;br /&gt;
apt purge &#039;~o&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list &#039;~c&#039;&lt;br /&gt;
apt purge &#039;~c&#039;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022.nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=DEAP&amp;diff=8781</id>
		<title>DEAP</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=DEAP&amp;diff=8781"/>
		<updated>2026-03-16T16:43:13Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Links */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
* deap00 links:&lt;br /&gt;
* https://deapdaqgw.snolab.ca/ - MIDAS status page&lt;br /&gt;
* https://deapdaqgw.snolab.ca/elog/ - DEAP00 ELOG&lt;br /&gt;
* https://deapdaqgw.snolab.ca/ganglia/ - GANGLIA system monitoring&lt;br /&gt;
* https://deapdaqgw.snolab.ca/gonodeinfo/gonodereport.html - computer configuration and status&lt;br /&gt;
* http://dug1.snolab.ca/ - data server&lt;br /&gt;
* https://deapdaqgw.snolab.ca/check/ - deapgw environment monitoring MIDAS status page&lt;br /&gt;
* (obsolete) https://deapdaqgw.snolab.ca/quotareport/quota.html - report deapdaqgw disk quota&lt;br /&gt;
* https://deapdaqgw.snolab.ca/zfsquotareport/zfsquota.html - report deapdaqgw disk use&lt;br /&gt;
* https://deapdaqgw.snolab.ca/pingmon/deapgw.html - deapgw network monitor&lt;br /&gt;
* https://deapdaqgw.snolab.ca/pingmon_deap00/deap00.html - deap00 network monitor&lt;br /&gt;
&lt;br /&gt;
* TWiki links:&lt;br /&gt;
* https://www.snolab.ca/deap/private/TWiki/bin/view SNOLAB Wiki&lt;br /&gt;
* https://www.snolab.ca/deap/private/TWiki/bin/view/Main/DeapDAQ - main documenation page&lt;br /&gt;
&lt;br /&gt;
* Direct links to DAQ hardware:&lt;br /&gt;
* https://deapdaqgw.snolab.ca/vme01/ VME crate 1 (all 3 VME crates: does not work from google-chrome, firefox is ok, safari is ok. after 10 sec reloads to the midas status page)&lt;br /&gt;
* https://deapdaqgw.snolab.ca/vme02/ VME crate 2&lt;br /&gt;
* https://deapdaqgw.snolab.ca/vme03/ VME crate 3&lt;br /&gt;
* https://deapdaqgw.snolab.ca:8443/ UPS (deapups, guest/guest)&lt;br /&gt;
* https://deapdaqgw.snolab.ca:8444/index.html Sentry Power Distribution Unit (deapcdu, deap/deap)&lt;br /&gt;
* https://deapdaqgw.snolab.ca:8445/ KVM (deapkvm8) (this proxy does not work)&lt;br /&gt;
* https://deapkvm8 (192.168.1.17) (deapkvm8) ATEN IP KVM (only works from firefox on deapdaqgw gateway machine - follow VNC instructions below for offsite access) (deapuser, deapuser)&lt;br /&gt;
* https://deapdaqgw.snolab.ca/deapcam01/ (deap, deapCAM3600, select &amp;quot;mobile mode sign-in&amp;quot;)&lt;br /&gt;
* https://deapdaqgw.snolab.ca/deapcam02/&lt;br /&gt;
* https://deapdaqgw.snolab.ca/deapcam03/&lt;br /&gt;
&lt;br /&gt;
* deapcam02 ssh tunnel: from local computer start tunnel: &amp;quot;ssh -v deap@deapdaqgw.snolab.ca -L localhost:8080:deapcam02:80&amp;quot; (you can omit &amp;quot;-v), then on a local web browser, open &amp;quot;http://localhost:8080&amp;quot; (&amp;quot;8080&amp;quot; is the number from the ssh command, you can use some other number if port 8080 is already in use).&lt;br /&gt;
&lt;br /&gt;
Fingerprints for the deapdaqgw.snolab.ca SSL certificate:&lt;br /&gt;
&lt;br /&gt;
* SHA1: D3 06 C6 80 40 0D 0D 9F 83 E5 AD CD EB F2 BE 7A F2 E4 4A 67&lt;br /&gt;
* MD5: 7D 9E AD 4F 1B 03 D9 63 10 E5 3F 1E ED 40 A1 EF&lt;br /&gt;
&lt;br /&gt;
Old fingerprints:&lt;br /&gt;
* SHA-256: 2A ED 88 3E 38 27 25 D0 1E 4D 48 A1 78 FC E0 0B 6E 58 00 FA A6 53 B1 FE 50 3D 91 CE C9 AB 08 19&lt;br /&gt;
* SHA-1: 1A FE 53 23 0A 22 F3 35 C8 20 CD 0E 0E F0 3F A7 72 B7 2F 29&lt;br /&gt;
&lt;br /&gt;
== DAQ machines ==&lt;br /&gt;
&lt;br /&gt;
moved here: https://www.snolab.ca/deap/private/TWiki/bin/view/Main/InfoNet#DAQ_Hardware&lt;br /&gt;
&lt;br /&gt;
== Power up sequence ==&lt;br /&gt;
&lt;br /&gt;
* power up and turn on all 3 UPSes&lt;br /&gt;
* network switch, CDU and gateway machine are connected to non-switchable UPS ports, they should power up and boot&lt;br /&gt;
* one should be able to ping the gateway machine&lt;br /&gt;
* ssh deapgw@deapdaqgw, ping deapups and deapcdu&lt;br /&gt;
* open the UPS and CDU web pages through the HTTPS proxy&lt;br /&gt;
* from the CDU web page (outlet control), turn on deap00. If deap00 is off (0 power use) but outlet is &amp;quot;on&amp;quot;, use the &amp;quot;reboot&amp;quot; action.&lt;br /&gt;
* wait for deap00 to boot (ping deap00)&lt;br /&gt;
* mhttpd and elog should start automatically&lt;br /&gt;
* open the DEAP MIDAS status page&lt;br /&gt;
* now one can ssh deap@deapdaqgw then ssh deap00&lt;br /&gt;
* on the MIDAS status page, start the slow controls frontends: UPS, CDU, VME crates and NutUps, clear all alarms. Do not start MPOD and SCB yet.&lt;br /&gt;
* all frontends should start &amp;quot;green&amp;quot;, except for &amp;quot;vme02&amp;quot; (and &amp;quot;mpod&amp;quot;) should report &amp;quot;communication problem&amp;quot;&lt;br /&gt;
* on the CDU web page, turn on all power outlets (use &amp;quot;global control action&amp;quot; - &amp;quot;on&amp;quot; - &amp;quot;apply&amp;quot;) &lt;br /&gt;
* wait for VME02 (and MPOD) to boot: their frontend status should turn &amp;quot;green&amp;quot;&lt;br /&gt;
* wait for deap01..deap05 to boot (no simple indication, but they should ping from deap00)&lt;br /&gt;
* from the MIDAS &amp;quot;VME&amp;quot; slow controls pages, turn on all 3 VME crates&lt;br /&gt;
* from the MIDAS &amp;quot;programs&amp;quot; page, start mpod and scb frontends. They status should show &amp;quot;green&amp;quot;&lt;br /&gt;
* from the MIDAS &amp;quot;MPOD_HV&amp;quot; page, turn on the MPOD (&amp;quot;main switch ON&amp;quot;, if ready to ramp up the voltages, &amp;quot;output ON&amp;quot;)&lt;br /&gt;
* from the MIDAS &amp;quot;SCB&amp;quot; page, turn on all SCBs (&amp;quot;ON&amp;quot; button)&lt;br /&gt;
* wait for lxdeap01 to boot (should be able to ping from deap00)&lt;br /&gt;
* from the MIDAS &amp;quot;programs&amp;quot; page, start all daq frontends&lt;br /&gt;
* clear all MIDAS alarms&lt;br /&gt;
* start a run, wait for a bit, stop the run (to confirm all frontends are happy)&lt;br /&gt;
* DAQ is now ready to take data&lt;br /&gt;
&lt;br /&gt;
== deapups connections ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
== UPS configuration ==&lt;br /&gt;
&lt;br /&gt;
=== Tripp-lite management software ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root@deap00&lt;br /&gt;
/opt/nut/bin/upsdrvctl stop&lt;br /&gt;
(unplug USB cable from UPS, wait 10 sec, plug it back in)&lt;br /&gt;
service pald restart&lt;br /&gt;
/var/tripplite/poweralert/console/pal_console.sh&lt;br /&gt;
### restore NUT monitoring&lt;br /&gt;
service pald stop ### this takes a few minutes&lt;br /&gt;
/opt/nut/bin/upsdrvctl start&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== USB connections ===&lt;br /&gt;
&lt;br /&gt;
* lsusb -v | grep -i product&lt;br /&gt;
* lsusb -v | grep -i serial&lt;br /&gt;
&lt;br /&gt;
=== NUT UPS configuration ===&lt;br /&gt;
&lt;br /&gt;
NB - UPS names are tied to the UPS serial numbers via the NUT config file!&lt;br /&gt;
&lt;br /&gt;
* http://www.networkupstools.org/&lt;br /&gt;
* ssh root@deap00&lt;br /&gt;
* (initial software checkout) cd ~; svn checkout svn://anonscm.debian.org/nut/trunk nut&lt;br /&gt;
* (update) cd ~/nut; svn update&lt;br /&gt;
* (build, install) cd ~/nut; ./autogen.sh; ./configure --prefix=/opt/nut; make -j6 -k; make -k; make -k install&lt;br /&gt;
* config file: /opt/nut/etc/ups.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[ups1]&lt;br /&gt;
        driver = usbhid-ups&lt;br /&gt;
        port = auto&lt;br /&gt;
        desc = &amp;quot;ups1&amp;quot;&lt;br /&gt;
        serial = &amp;quot;2231ELCPS720300082&amp;quot;&lt;br /&gt;
[ups2]&lt;br /&gt;
        driver = usbhid-ups&lt;br /&gt;
        port = auto&lt;br /&gt;
        desc = &amp;quot;ups2&amp;quot;&lt;br /&gt;
        serial = &amp;quot;2211KW0PS733900093&amp;quot;&lt;br /&gt;
[ups3]&lt;br /&gt;
        driver = usbhid-ups&lt;br /&gt;
        port = auto&lt;br /&gt;
        desc = &amp;quot;ups3&amp;quot;&lt;br /&gt;
        serial = &amp;quot;2231ELCPS720300090&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restart drivers: /opt/nut/bin/upsdrvctl start&lt;br /&gt;
* reload upsd: /opt/nut/sbin/upsd -c reload&lt;br /&gt;
* see ups status: /opt/nut/bin/upsc ups1&lt;br /&gt;
&lt;br /&gt;
== deapcdu connections ==&lt;br /&gt;
&lt;br /&gt;
moved here: https://www.snolab.ca/deap/private/TWiki/bin/view/Main/HWconnection#CDU_Power_connections&lt;br /&gt;
&lt;br /&gt;
== deapcdu snmp ==&lt;br /&gt;
&lt;br /&gt;
* snmpwalk -v 2c -M +/home/deap/online/slow/fesnmp -m +Sentry3-MIB -c public deapcdu sentry3&lt;br /&gt;
* snmpset -v 2c -M +/home/deap/online/slow/fesnmp -m +Sentry3-MIB -c write deapcdu outletControlAction.1.1.1 i 1 ### turn on outlet 1&lt;br /&gt;
* snmpset -v 2c -M +/home/deap/online/slow/fesnmp -m +Sentry3-MIB -c write deapcdu outletControlAction.1.1.3 i 2 ### turn off outlet 3&lt;br /&gt;
&lt;br /&gt;
== VME and MPOD snmp ==&lt;br /&gt;
&lt;br /&gt;
* snmpwalk -v 2c -M +/home/deap/online/slow/fewiener -m +WIENER-CRATE-MIB -c guru deapvme01 crate&lt;br /&gt;
* snmpset -v 2c -M +/home/deap/online/slow/fewiener -m +WIENER-CRATE-MIB -c guru deapvme01 sysMainSwitch.0 i 1 ### turn crate on&lt;br /&gt;
* snmpset -v 2c -M +/home/deap/online/slow/fewiener -m +WIENER-CRATE-MIB -c guru deapvme01 sysMainSwitch.0 i 0 ### turn crate off&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Network configuration (DEAP) ==&lt;br /&gt;
&lt;br /&gt;
The DEAP DAQ cluster is configured for standalone running with or without an internet connection.&lt;br /&gt;
&lt;br /&gt;
(NB: Some internet functions are required: access to NTP for time synchronization and access to Linux package repositories to install packages, etc)&lt;br /&gt;
&lt;br /&gt;
=== Network numbers ===&lt;br /&gt;
&lt;br /&gt;
moved here: https://www.snolab.ca/deap/private/TWiki/bin/view/Main/InfoNet#Network_Configuration_DEAP&lt;br /&gt;
&lt;br /&gt;
=== Network cabling ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deapdaqgw:&lt;br /&gt;
enp4s0 - eth0 - uplink (dhcp)&lt;br /&gt;
enp5s0 - eth1 - daq private network&lt;br /&gt;
&lt;br /&gt;
deap00 mobo, e1000e driver -&lt;br /&gt;
eth0 - daq private network (dhcp)&lt;br /&gt;
eth1 - deap05e&lt;br /&gt;
deap00 pcie nic, igb driver - (top to bottom)&lt;br /&gt;
eth2 - deap01a&lt;br /&gt;
eth3 - deap02b&lt;br /&gt;
eth4 - deap03c&lt;br /&gt;
eth5 - deap04d&lt;br /&gt;
deap00 10gige nic, sfc driver -&lt;br /&gt;
eth6 - n/c&lt;br /&gt;
eth7 - dug1 (10gige)&lt;br /&gt;
&lt;br /&gt;
deap01..deap05:&lt;br /&gt;
eth0 - daq private network&lt;br /&gt;
eth1 - secondary network direct link to deap00&lt;br /&gt;
&lt;br /&gt;
lxdeap01:&lt;br /&gt;
eth0 or eth1 - daq private network (use either port)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== DHCP configuration ===&lt;br /&gt;
&lt;br /&gt;
Main DHCP server is running on the gateway machine. It provides IP addresses to all devices on the main private network. apt install isc-dhcp-server, systemctl enable isc-dhcp-server&lt;br /&gt;
&lt;br /&gt;
Additional DHCP server is running on deap00. It provides IP addresses to the secondary network links to deap00 (deap01a..deap04d)&lt;br /&gt;
&lt;br /&gt;
See following sections for more details.&lt;br /&gt;
&lt;br /&gt;
DEAP network nodes with statically configured IP addresses:&lt;br /&gt;
* deapmod : Wiener MPOD firmware does not support DHCP&lt;br /&gt;
&lt;br /&gt;
=== Gateway machine ===&lt;br /&gt;
&lt;br /&gt;
deapdaqgw is the gateway machine that provides internet access to the DEAP DAQ cluster.&lt;br /&gt;
&lt;br /&gt;
* NAT (&amp;quot;network address translation&amp;quot;, see /etc/rc.local)&lt;br /&gt;
* IP address assignement via /etc/hosts&lt;br /&gt;
* DNS via dnsmasq serving contents of /etc/hosts and bridge to upstream DNS (configured in /etc/resolv.conf by upstream DHCP). apt install dnsmasq, systemctl enable dnsmasq, see Ubuntu instructions.&lt;br /&gt;
* DHCP for all machines via /etc/dhcpd/dhcpd.conf, Special DHCP settings:&lt;br /&gt;
** &amp;quot;option routers&amp;quot; sets the &amp;quot;default route&amp;quot; through the gateway machine itself&lt;br /&gt;
** &amp;quot;option domain-name-servers&amp;quot; sets the DNS server in /etc/resolv.conf to dnsmasq on the gateway machine&lt;br /&gt;
** &amp;quot;option ntp-servers&amp;quot; specifies the time servers, (but not used by any hosts?)&lt;br /&gt;
** &amp;quot;option domain-name&amp;quot; is not specified, leaving the &amp;quot;domain&amp;quot; and &amp;quot;search&amp;quot; entries of /etc/resolv.conf blank (actually the entries are not there)&lt;br /&gt;
** unknown clients are assigned IP addresses in the range 192.168.x.200 through .250.&lt;br /&gt;
** MSCB nodes are assigned &amp;quot;infinite&amp;quot; leases by avoid a bug in MSCB firmware&lt;br /&gt;
** remember to &amp;quot;service dhcpd restart&amp;quot; after editing /etc/dhcp/dhcpd.conf&lt;br /&gt;
* HTTPS proxy for midas, elog, and other web-connected devices (see links above). Edit /etc/httpd/conf.d/*.conf&lt;br /&gt;
* cron job: zfsquotareport&lt;br /&gt;
* cron job: pingmon network monitor&lt;br /&gt;
* MIDAS experiment &amp;quot;check&amp;quot; (user deapgw)&lt;br /&gt;
&lt;br /&gt;
=== deap00 machine ===&lt;br /&gt;
&lt;br /&gt;
deap00 is the main machine for the DEAP DAQ cluster.&lt;br /&gt;
&lt;br /&gt;
* DHCP for secondary network links to frontend machines, remember to &amp;quot;service dhcpd restart&amp;quot; after editing /etc/dhcp/dhcpd.conf&lt;br /&gt;
* NIS master&lt;br /&gt;
* NFS export of home disks, data disks (NFS exports list: edit /etc/netgroup, run &amp;quot;make -C /var/yp&amp;quot;)&lt;br /&gt;
* httpd for ganglia, nodeinfo, etc&lt;br /&gt;
* xinetd, tftpd for booting deap01..05, lxdeap01&lt;br /&gt;
&lt;br /&gt;
==== network port assignments ====&lt;br /&gt;
&lt;br /&gt;
* eth0: main connection to the local network, IP address is assigned by DHCP from the gateway machine&lt;br /&gt;
* eth1: connected to deap05&lt;br /&gt;
* eth2..eth5: Intel 4-port card, ports are numbered from the top, connected to deap01..deap04 in order.&lt;br /&gt;
* eth6..eth7: 10GigE network card&lt;br /&gt;
&lt;br /&gt;
==== disks configuration ====&lt;br /&gt;
&lt;br /&gt;
* disk list: 2x120GB SSD, 2x3TB + 2x4TB HDD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@deap00 ~]# date&lt;br /&gt;
Fri Apr 10 18:00:12 EDT 2015&lt;br /&gt;
[root@deap00 ~]# ./smart-status.perl &lt;br /&gt;
      Disk                  model               serial     temperature  realloc  pending   uncorr  CRC err     RRER&lt;br /&gt;
  /dev/sda   WDC WD40EZRX-00SPEB0      WD-WCC4E0555417              41        0        0        0        0        0&lt;br /&gt;
  /dev/sdb   WDC WD40EZRX-00SPEB0      WD-WCC4E0602954              39        0        0        0        0        0&lt;br /&gt;
  /dev/sdc     ST3000DM001-9YN166             W1F0SG0W              31        0        0        0        6        -&lt;br /&gt;
  /dev/sdd     ST3000DM001-9YN166             W1F0THDE              33        0        0        0        0        -&lt;br /&gt;
  /dev/sde KINGSTON SV300S37A120G     50026B7744027BCB              33        0        ?        ?        ?        -&lt;br /&gt;
  /dev/sdf KINGSTON SV300S37A120G     50026B774909A85D              30        2        ?        ?        ?        -&lt;br /&gt;
[root@deap00 ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* spare disk: the 1st 4TB HDD is the hot spare. It is partitioned to be compatible with replacement in case of failure of any other disks. Only /dev/sda1 is used (as a bootable partition).&lt;br /&gt;
* filesystems:&lt;br /&gt;
** &amp;quot;/&amp;quot; is /dev/md4 RAID1 of sde1, sdf1, sdb1(W), sda1(W). Special note &amp;quot;W&amp;quot; means &amp;quot;write mostly&amp;quot; - means avoid reading from these disks - means read from SSD but write to both SSD and HDD (SSD, SSD, 4TB, 4TB)&lt;br /&gt;
** &amp;quot;/home&amp;quot; is /dev/md5 RAID5 of sdb1, sdc1, sdd1 (4TB, 3TB, 3TB)&lt;br /&gt;
** swap is /dev/md6 RAID5 sdb2, sdc2, sdd2 (4TB, 3TB, 3TB)&lt;br /&gt;
** &amp;quot;/data&amp;quot; is /dev/md7 RAID5 sdb3, sdc3, sdd3 (4TB, 3TB, 3TB)&lt;br /&gt;
** note how 4TB /dev/sda is partitioned same as /dev/sdb, but only /dev/sda1 is used - the rest of the disk as a &amp;quot;hot spare&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@deap00 ~]# date&lt;br /&gt;
Mon Apr 13 14:49:03 EDT 2015&lt;br /&gt;
[root@deap00 ~]# cat /proc/mdstat | grep active | sort&lt;br /&gt;
md4 : active raid1 sda1[7](W) sdb1[4](W) sde1[5] sdf1[6]&lt;br /&gt;
md5 : active raid5 sdb3[5] sdc1[3] sdd1[0]&lt;br /&gt;
md6 : active raid5 sdb2[5] sdc2[3] sdd2[0]&lt;br /&gt;
md7 : active raid5 sdb4[5] sdc3[3] sdd3[0]&lt;br /&gt;
[root@deap00 ~]# date&lt;br /&gt;
Fri Apr 10 18:01:45 EDT 2015&lt;br /&gt;
[root@deap00 ~]# df -kl&lt;br /&gt;
Filesystem      1K-blocks       Used  Available Use% Mounted on&lt;br /&gt;
/dev/md4        115246492   52353428   57033052  48% /&lt;br /&gt;
tmpfs            16414940    1894852   14520088  12% /dev/shm&lt;br /&gt;
/dev/md5        403039088  240822952  141736292  63% /home&lt;br /&gt;
/dev/md7       5236247032 1709964112 3260290168  35% /data&lt;br /&gt;
[root@deap00 ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== NIS configuration ===&lt;br /&gt;
&lt;br /&gt;
Usernames, passwords and hostnames are distributed using NIS:&lt;br /&gt;
* domain name: DEAP-NIS&lt;br /&gt;
* deap00 is the master server&lt;br /&gt;
* there are no secondary servers&lt;br /&gt;
&lt;br /&gt;
=== Time configuration ===&lt;br /&gt;
&lt;br /&gt;
* deapdaqgw time is configured in /etc/ntp.conf (currently triumf, dsurface, ca.pool.ntp.org)&lt;br /&gt;
* deapdaqgw DHCP configuration file /etc/dhcp/dhcpd.conf line &amp;quot;option ntp-servers&amp;quot; provides time servers to all dhcp clients (currently deapdaqgw, except deap00, deap01..05, lxdeap01: &amp;quot;option ntp-servers 0.0.0.0&amp;quot;)&lt;br /&gt;
* deap00 and frontend machines:&lt;br /&gt;
** /etc/ntp.conf specifies: &amp;quot;server deapdaqgw iburst prefer&amp;quot; options are: iburst=quick sync, prefer=prefer to use this server&lt;br /&gt;
** in addition, local dhcp client writes the dhcp ntp-servers &amp;quot;0.0.0.0&amp;quot; into /etc/ntp.conf which seems to be benign but we do now know how turn this off.&lt;br /&gt;
&lt;br /&gt;
deapdaqgw is used as the time master instead of deap00 to make the configuration more symmetric: deap00 and all frontend machines have the same time configuration instead of deap00 being different.&lt;br /&gt;
&lt;br /&gt;
=== System monitoring tools ===&lt;br /&gt;
&lt;br /&gt;
* ganglia&lt;br /&gt;
* triumf_nodeinfo&lt;br /&gt;
* konstantin&#039;s ganglia packages (monitor_nfs, ganglia sensors, top, etc) - To install/update: see TRIUMF SL install instructions.&lt;br /&gt;
&lt;br /&gt;
=== VNC access to the KVM ===&lt;br /&gt;
&lt;br /&gt;
Generic VNC instructions: [[VNC]]&lt;br /&gt;
&lt;br /&gt;
DEAP specific VNC instruction:&lt;br /&gt;
&lt;br /&gt;
* start local VNC client in &amp;quot;listen mode&amp;quot; as described at [[VNC]] (usually: vncviewer -listen 5500)&lt;br /&gt;
* ssh deap@deapdaqgw&lt;br /&gt;
* rm ~/.vnc/passwd&lt;br /&gt;
* vncserver -geometry 1600x1200 ### watch the output line: &amp;quot;desktop is deapdaqgw:2&amp;quot; &amp;lt;--- remember the value &amp;quot;:2&amp;quot; printed (it will be different each time)&lt;br /&gt;
* vncconfig -display localhost:2 -connect send.triumf.ca:5500  &amp;lt;--- localhost:2 uses the &amp;quot;:2&amp;quot; from the vncserver output, &amp;quot;send.triumf.ca:5500&amp;quot; is the location and port of your VNC client.&lt;br /&gt;
* inside VNC:&lt;br /&gt;
** open a terminal. We are deap@deapdaqgw&lt;br /&gt;
** inside terminal start: firefox&lt;br /&gt;
** if firefox complains about running elsewhere, find where it is running and kill it&lt;br /&gt;
** open https://deapkvm8&lt;br /&gt;
** login as administrator or deapuser (password deapuser)&lt;br /&gt;
** go to a console port, click &amp;quot;connect&amp;quot;. If default configuration is correct, the java program for the KVM console window will open&lt;br /&gt;
** it may prompt for permission to run ATEN Java application&lt;br /&gt;
** it may prompt for which application to use to open &amp;quot;java web start&amp;quot; files. Select: Downloads/javaws (symlink to /usr/java/jre1.8.0_31/bin/javaws)&lt;br /&gt;
** NB: KVM firmware loads a 32-bit library libikvmlib which requires 32-bit java which requires &amp;quot;yum install gtk2.i686&amp;quot;&lt;br /&gt;
** the java application with the KVM console window should open&lt;br /&gt;
** if java refuses to start the applet due to &amp;quot;strict permissions&amp;quot;, add an exception to this: run jcontrol, in the &amp;quot;security&amp;quot; tab, &amp;quot;edit site list...&amp;quot;, add &amp;quot;https://deapkvm8&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Backups ==&lt;br /&gt;
&lt;br /&gt;
Backups of all system disks (SSD and USB flash media) are done to the deap00 data disk. This includes deapdaqgw and deap00 SSDs:&lt;br /&gt;
&lt;br /&gt;
* deap00 cron job /etc/cron.d/backup.lxdaq.cron&lt;br /&gt;
* runs script deap00:~root/backup.lxdaq&lt;br /&gt;
* writes backups to deap00 data disk: deap00:/data/root/backups:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@deap00 ~]# ls -l /data/root/backups/&lt;br /&gt;
total 56&lt;br /&gt;
-rwxr-xr-x  1 root root 4208 Dec  7  2012 clone.perl&lt;br /&gt;
dr-xr-xr-x 31 root root 4096 Jul  3 13:28 deap00   &amp;lt;--- backup of deap00 &amp;quot;/&amp;quot; (raid1 mirrored SSDs)&lt;br /&gt;
dr-xr-xr-x 28 root root 4096 Jul  3 13:32 deap01   &amp;lt;--- backups turned off&lt;br /&gt;
dr-xr-xr-x 28 root root 4096 Jul  3 13:32 deap02   &amp;lt;--- same&lt;br /&gt;
dr-xr-xr-x 28 root root 4096 Apr 19 18:44 deap03 &amp;lt;--- same&lt;br /&gt;
dr-xr-xr-x 28 root root 4096 Jul  3 13:32 deap04   &amp;lt;--- same&lt;br /&gt;
dr-xr-xr-x 28 root root 4096 Jul  3 13:32 deap05   &amp;lt;--- same&lt;br /&gt;
dr-xr-xr-x 28 root root 4096 Mar  2 21:32 deap07  &amp;lt;--- same&lt;br /&gt;
dr-xr-xr-x 28 root root 4096 Mar  2 21:32 deap08  &amp;lt;--- same&lt;br /&gt;
dr-xr-xr-x 29 root root 4096 Jul  3 11:10 deapdaqgw  &amp;lt;--- backup of deapdaqgw single SSD&lt;br /&gt;
dr-xr-xr-x 26 root root 4096 Jul  3 13:38 lxdeap01    &amp;lt;--- backup of lxdeap01 USB flash disk&lt;br /&gt;
-rwxr-xr-x  1 root root 7672 Dec  7  2012 uuidfix.perl&lt;br /&gt;
[root@deap00 ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* clone.perl and uuidfix.perl are the scripts for writing these backups back to bootable media (to 16GB USB flash disk or to 30/60GB SSD)&lt;br /&gt;
&lt;br /&gt;
Backups of deap00 home disk, deapdaqgw and of the backups of deap00, deap01 and lxdeap01 system disks are done to TRIUMF ladd00 data disk.&lt;br /&gt;
&lt;br /&gt;
* ladd00 cron job /etc/cron.d/backup.os.cron&lt;br /&gt;
* runs script /root/backup.os.all&lt;br /&gt;
* runs script &amp;quot;/root/backup.os deapdaqgw.snolab.ca&amp;quot; writes to /ladd/data0/backup.os/deapdaqgw.snolab.ca&lt;br /&gt;
* runs script /root/backup.deap:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /ladd/data0/backup.os&lt;br /&gt;
rsync -avx --delete-after deapdaqgw.snolab.ca:/data/root/backups/deap00 deap/deap00 &amp;gt;&amp;gt; $lastlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
rsync -avx --delete-after deapdaqgw.snolab.ca:/data/root/backups/deap01 deap/deap01 &amp;gt;&amp;gt; $lastlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
rsync -avx --delete-after deapdaqgw.snolab.ca:/data/root/backups/lxdeap01 deap/lxdeap01 &amp;gt;&amp;gt; $lastlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
rsync -avx --delete-after --max-size=100000000 deapdaqgw.snolab.ca:/home deap/home &amp;gt;&amp;gt; $lastlog 2&amp;gt;&amp;amp;1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@ladd00 ~]# ls -l /ladd/data0/backup.os/ /ladd/data0/backup.os/deap&lt;br /&gt;
/ladd/data0/backup.os/:&lt;br /&gt;
...&lt;br /&gt;
drwxr-xr-x  6 root root   4096 Jun 17 15:34 deap&lt;br /&gt;
dr-xr-xr-x 29 root root   4096 Jul  3 08:10 deapdaqgw.snolab.ca&lt;br /&gt;
-rw-r--r--  1 root root   2414 Jul  8 15:01 deapdaqgw.snolab.ca.last.log&lt;br /&gt;
-rw-r--r--  1 root root 113454 Jul  8 15:24 deap.last.log&lt;br /&gt;
...&lt;br /&gt;
/ladd/data0/backup.os/deap:&lt;br /&gt;
total 16&lt;br /&gt;
drwxr-xr-x 3 root root 4096 Jun 12 12:53 deap00&lt;br /&gt;
drwxr-xr-x 3 root root 4096 Jun 12 12:55 deap01&lt;br /&gt;
drwxr-xr-x 3 root root 4096 Jun 17 15:34 home&lt;br /&gt;
drwxr-xr-x 3 root root 4096 Jun 12 12:56 lxdeap01&lt;br /&gt;
[root@ladd00 ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
There are no backups of the deap00 data disks.&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Quartus&amp;diff=8771</id>
		<title>Quartus</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Quartus&amp;diff=8771"/>
		<updated>2026-03-10T18:20:54Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* How to run Quartus */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Links ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
== How to run Quartus ==&lt;br /&gt;
&lt;br /&gt;
=== Quartus versions to use with different projects ===&lt;br /&gt;
&lt;br /&gt;
* cyclone I: VF48, VME-NIMIO32, etc: /daq/quartus/13.0sp1/quartus/bin/quartus on U-20&lt;br /&gt;
* cyclone III: PPG32, etc: /daq/quartus/13.1.4.182/quartus/bin/quartus on U-20&lt;br /&gt;
* cyclone IV: gpmc-camac-aux-firmware (CAMAC interface): quartus 23.1&lt;br /&gt;
* cyclone V: ALPHA-g PWB, ALPHA-g ADC: quartus 17.0 (17.1 and newer have incompatible NIOS ethernet interface)&lt;br /&gt;
* cyclone V SoC: chronobox, dltdc: 21.1&lt;br /&gt;
* cyclone V: VME-NIMIO32-Rev3: 20.1&lt;br /&gt;
* stratix IV: ALPHA-g TRG: quartus 20.1.1&lt;br /&gt;
* max V: ALPHA-g TRG: quartus 20.1.1&lt;br /&gt;
&lt;br /&gt;
=== Available versions of Quartus ===&lt;br /&gt;
&lt;br /&gt;
* ls -l /daq/quartus (mount -o ro daq00:/quartus /daq/quartus and mount -o ro daqstore.triumf.ca:/pool/daqstore /daq/daqstore)&lt;br /&gt;
&lt;br /&gt;
Archive of quartus distribution files:&lt;br /&gt;
&lt;br /&gt;
* /daq/quartus_archive (mount -o ro daqstore:/z6tb/quartus_archive)&lt;br /&gt;
&lt;br /&gt;
=== Select a quartus license ===&lt;br /&gt;
&lt;br /&gt;
* daq01 license, ubuntu-20.04: start license server: &amp;quot;ssh daq01 /opt/intelFPGA/20.1/quartus/linux64/lmgrd -c /home/olchansk/daq/altera/license-daq01.dat&amp;quot;&lt;br /&gt;
* daq13 license, ubuntu-20.04: start license server: &amp;quot;ssh daq13 /opt/intelFPGA/20.1/quartus/linux64/lmgrd -c /home/olchansk/daq/altera/license-daq13.dat&amp;quot;&lt;br /&gt;
* daq16 license, centos-7: start license server: &amp;quot;ssh daq16 /daq/quartus/16.1/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-daq16.dat&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* (temp not available) ladd05 nodelocked license: run quartus on ladd05, use license file /home/olchansk/daq/altera/license-ladd05.dat&lt;br /&gt;
* (temp not available) ladd01 nodelocked license: run quartus on ladd01, use license file /home/olchansk/daq/altera/license-ladd01.dat&lt;br /&gt;
* (temp not available) daqshare floating license: start license server: &amp;quot;ssh daqshare /daq/daqshare/olchansk/altera/13.1.3.178/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-daqshare.dat&amp;quot;, run quartus anywhere, use license file /home/olchansk/daq/altera/license-daqshare.dat&lt;br /&gt;
* (temp not available) ladd09 floating license: start license server: &amp;quot;ssh ladd09 /daq/daqshare/olchansk/altera/12.0/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-ladd09.dat&amp;quot;, run quartus anywhere, use license file /home/olchansk/daq/altera/license-ladd09.dat&lt;br /&gt;
* (temp not available) ladd12 floating license: start license server: &amp;quot;ssh ladd12 /daq/daqshare/olchansk/altera/12.0/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-ladd12.dat&amp;quot;, run quartus anywhere, use license file /home/olchansk/daq/altera/license-ladd12.dat&lt;br /&gt;
* (moved to alpha03, use license-alpha03.dat) daq19 floating license: start license server: &amp;quot;ssh -n tigress@daq19 /daq/daqshare/olchansk/altera/12.0/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-daq19.dat &amp;amp;&amp;quot;, run quartus anywhere, use license file /home/olchansk/daq/altera/license-daq19.dat&lt;br /&gt;
&lt;br /&gt;
=== Mac addresses ===&lt;br /&gt;
&lt;br /&gt;
* old ladd01/daqshare license: 00:1e:8c:7c:ff:03&lt;br /&gt;
* old ladd01 nodelocked license: 00:30:48:76:2e:42 00:30:48:76:2e:43&lt;br /&gt;
* old ladd09 license: 00:13:d4:92:5e:a3&lt;br /&gt;
* old ladd12 license: 00:1c:c0:fa:be:df&lt;br /&gt;
* old ladd19/daq19 license: 10:bf:48:4e:1e:89&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu Caveats ===&lt;br /&gt;
&lt;br /&gt;
* Ubuntu LTS 20.04&lt;br /&gt;
* /opt/intelFPGA/17.0/quartus/bin/jtagconfig does not work, killall -KILL jtagd and use /daq/quartus/13.0sp1/quartus/bin/jtagconfig, then jtag works.&lt;br /&gt;
&lt;br /&gt;
=== (OBSOLETE) SL/CentOS Caveats ===&lt;br /&gt;
&lt;br /&gt;
* If Quartus 13.1 crashes on startup, see this: http://www.altera.com/support/kdb/solutions/rd12102013_780.html&lt;br /&gt;
&lt;br /&gt;
* If Quartus 13.0, 13.1, etc crashes on startup with error about &amp;quot;SSL_library_init&amp;quot;, see https://www.altera.com/support/support-resources/knowledge-base/solutions/rd12102013_780.html. Solution is to verify presence of &amp;quot;/usr/lib64/libcrypto.so.0.9.8e&amp;quot;, erase it with &amp;quot;rpm --erase openssl098e&amp;quot;, then verify it has been erased.&lt;br /&gt;
&lt;br /&gt;
== Interfacing with hardware ==&lt;br /&gt;
&lt;br /&gt;
* To download pof files into VME modules with Active Serial EPROMs (i.e. VF48 modules): see /home/olchansk/daq/vf48/firmware/load.perl&lt;br /&gt;
* To download pof files into VME modules with VME-accessible Flash Programmer (VF48, etc) use the &amp;quot;srunner_vme&amp;quot; program, see /home/olchansk/packages/vme/srunner*&lt;br /&gt;
* To download sof files into VME modules using JTAG interface, see /home/olchansk/daq/vf48/firmware/load_jtag_fe.perl&lt;br /&gt;
&lt;br /&gt;
== Accessing USB-Blaster attached to remote computer ==&lt;br /&gt;
&lt;br /&gt;
=== Using JTAGD 2025-OCT ===&lt;br /&gt;
&lt;br /&gt;
* DE10 is attached to daq17, quartus runs on dsdaqgw&lt;br /&gt;
&lt;br /&gt;
open termiminal on machine where usb blaster is attached:&lt;br /&gt;
* run jtagconfig to confirm usb blaster is attached correctly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq17:~$ /daq/quartus/21.1/quartus/bin/jtagconfig&lt;br /&gt;
1) DE-SoC [3-4]                               &lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) Remote server daq16: Unable to connect&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* killall -KILL jtagd&lt;br /&gt;
* echo &#039;Password = &amp;quot;123&amp;quot;;&#039; &amp;gt;&amp;gt; ~/.jtagd.conf&lt;br /&gt;
* /daq/quartus/21.1/quartus/bin/jtagd --user-start&lt;br /&gt;
* lsof -P | grep jtagd | grep IP ### note jtagd port number, usually 1309, note it is bound to localhost, we will need to use a tcp tunnel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jtagd     3839700                               olchansk    4u     IPv4          531471689       0t0       TCP localhost:1309 (LISTEN)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* /daq/quartus/21.1/quartus/bin/jtagconfig ### should still work&lt;br /&gt;
&lt;br /&gt;
open a terminal to run the ssh tunnel:&lt;br /&gt;
* login to the remote machine where we will run quartus compilations and quartus signal tap&lt;br /&gt;
* ssh dsdaqgw&lt;br /&gt;
* ps -efw | grep jtagd, kill all copies of jtagd already running. may have to close signaltap if it is already open&lt;br /&gt;
* ssh -v daq17 -L1309:127.0.0.1:1309&lt;br /&gt;
&lt;br /&gt;
open a terminal to run quartus and signal tap&lt;br /&gt;
* ssh dsdaqgw, cd git/chronobox_firmware, run quartus setup scripts from Makefile&lt;br /&gt;
* ncat localhost 1309 # should reply with &amp;quot;JTAG Server&amp;quot; and the other terminal should report tunnel connection on port 1309&lt;br /&gt;
* run jtagconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:chronobox_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC [3-4]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
dsdaqgw:chronobox_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if jtagconfig reports &amp;quot;Error when scanning hardware - Server error&amp;quot;, check that jtagd is still running on daq17, restart it if it does not.&lt;br /&gt;
* from here remote usb blaster should work same as the local one (signal tap, etc)&lt;br /&gt;
&lt;br /&gt;
=== Using JTAGD (obsolete) ===&lt;br /&gt;
&lt;br /&gt;
* install jtagd system files per [[SLinstall#Configure_Altera_jtagd]]&lt;br /&gt;
* this sets the jtagd password to &amp;quot;123&amp;quot;&lt;br /&gt;
* ssh to the machine where the USB-Blaster is connected&lt;br /&gt;
* start local jtagd: /daq/daqshare/olchansk/altera/11.0/quartus/bin/jtagd&lt;br /&gt;
* NOTE: jtagd from .../quartus/linux64/jtagd will not run, please use .../quartus/bin/jtagd&lt;br /&gt;
* test local connection: /daq/daqshare/olchansk/altera/11.0/quartus/bin/jtagconfig&lt;br /&gt;
* add this machine to $HOME/.jtag.conf: (replace &amp;quot;laddvme05&amp;quot; with the name of the machine where the USB blaster is attached)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/olchansk/.jtag.conf&lt;br /&gt;
Remote2 {&lt;br /&gt;
	Host = &amp;quot;laddvme05&amp;quot;;&lt;br /&gt;
	Password = &amp;quot;123&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test remote connection: run jtagconfig, now your device should show up two times - first for the local USB connection and second for the remote jtagd connection&lt;br /&gt;
* go to your quartus machine, start quartus, open your project file&lt;br /&gt;
* open tools-&amp;gt;programmer&lt;br /&gt;
* open hardware setup, you should see an entry for your jtag connection&lt;br /&gt;
* use the remote jtag connection the same way as a local jtag connection.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH tunnel ===&lt;br /&gt;
&lt;br /&gt;
To access USB-Blaster Jtag interface attached to a remote computer: (from https://ladd00.triumf.ca/elog/DAS/437)&lt;br /&gt;
 &lt;br /&gt;
Assume we have the USB blaster connected to laddvme05 (target) and we will run quartus on ladd00 (quartus host)&lt;br /&gt;
* login to ladd00&lt;br /&gt;
* get rid of possibly running local jtagd processes: killall -KILL jtagd&lt;br /&gt;
* start the ssh tunnel: ssh laddvme05 -L1309:127.0.0.1:1309&lt;br /&gt;
* inside the ssh tunnel (on the target machine) start the jtagd daemon: jtagd --user-start (assuming quartus tools are in your $PATH, otherwise use full pathnames, i.e. /triumfcs/trshare/olchansk/altera/altera9.1/quartus/bin/jtagd --user-start)&lt;br /&gt;
* inside the ssh tunnel (on the target machine) check that jtag local connection works: jtagconfig&lt;br /&gt;
* if jtagconfig does not work, check permissions on the /proc/bus/usb/*/* devices, they should be &amp;quot;rw-rw-rw&amp;quot;. If they are not, fix them by hand: login as root and run &amp;quot;chmod a+wr /proc/bus/usb/*/*&amp;quot; or follow the instructions for changing default usb permissions at https://www.triumf.info/wiki/DAQwiki/index.php/SLinstall&lt;br /&gt;
* leave the ssh tunnel window alone (iconize it)&lt;br /&gt;
* login to ladd00&lt;br /&gt;
* again get rid of possibly running local jtagd processes: killall -KILL jtagd&lt;br /&gt;
* go to the quartus project directory, start quartus, open the quartus project&lt;br /&gt;
* start the jtag progammer from &amp;quot;quartus -&amp;gt; tools -&amp;gt; programmer&amp;quot;&lt;br /&gt;
* start the jtag signal  tap tool from &amp;quot;quartus -&amp;gt; tools -&amp;gt; signal tap II logic analyzer&amp;quot;&lt;br /&gt;
* in either place, you should see the USB blaster is if it were locally connected.&lt;br /&gt;
&lt;br /&gt;
Troubleshooting:&lt;br /&gt;
&lt;br /&gt;
if remote jtag connection does not work, try this, report the results:&lt;br /&gt;
* jtagconfig on the machine where the USB blaster is locally connected should see the jtag devices. Typical malfunctions are wrong permissions on the USB files (fix as described above) and stale/bad jtagd running (kill it, restart it)&lt;br /&gt;
* local jtagd should talk to us: &amp;quot;telnet localhost 1309&amp;quot; should report &amp;quot;JTAG Server&amp;quot;&lt;br /&gt;
* ssh tunnel should be running (ssh -L)&lt;br /&gt;
* the tunnel should work (on the other end of the tunnel, i.e. on ladd00), &amp;quot;telnet localhost 1309&amp;quot; should report &amp;quot;JTAG Server&amp;quot;&lt;br /&gt;
jtagconfig should see the same devices&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
=== Enable 64-bit by default ===&lt;br /&gt;
&lt;br /&gt;
* edit .../quartus/adm/qenv.sh to read: - add one line as indicated:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##### Check if should use 64-bit executables &lt;br /&gt;
 &lt;br /&gt;
unset USE_64BIT &lt;br /&gt;
# If we are on a 64-bit system, use 64-bit if QUARTUS_64BIT is set and != 0 &lt;br /&gt;
# Also use it if we are running jtagd, since it interacts with hardware it must\&lt;br /&gt;
 always match the OS &lt;br /&gt;
if test $QUARTUS_BIT_TYPE = &amp;quot;64&amp;quot; ; then &lt;br /&gt;
        USE_64BIT=1 ### &amp;lt;---------------------------------------------- add this line&lt;br /&gt;
        if test &amp;quot;$CMD_NAME&amp;quot; = &amp;quot;jtagd&amp;quot; ; then &lt;br /&gt;
                USE_64BIT=1 &lt;br /&gt;
        elif test &amp;quot;${QUARTUS_64BIT-UNSET}&amp;quot; != UNSET ; then &lt;br /&gt;
                if test $QUARTUS_64BIT != &amp;quot;0&amp;quot; ; then &lt;br /&gt;
                        USE_64BIT=1 &lt;br /&gt;
                fi &lt;br /&gt;
        fi &lt;br /&gt;
fi &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debug the license server ===&lt;br /&gt;
&lt;br /&gt;
* show available hostid:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /daq/daqshare/olchansk/altera/12.1/quartus/linux/lmutil lmhostid&lt;br /&gt;
lmutil - Copyright (c) 1989-2008 Acresso Software Inc. All Rights Reserved.&lt;br /&gt;
The FLEXnet host ID of this machine is &amp;quot;&amp;quot;00167639501b 0013d4925ea3&amp;quot;&amp;quot;&lt;br /&gt;
Only use ONE from the list of hostids.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fudge the hostid:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link set dev eth3 address 00:13:D4:92:5E:A3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe bonding&lt;br /&gt;
echo +bond0 &amp;gt; /sys/class/net/bonding_masters&lt;br /&gt;
ifconfig bond0&lt;br /&gt;
ip link set dev bond0 address 00:13:D4:92:5E:A3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Quartus&amp;diff=8770</id>
		<title>Quartus</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Quartus&amp;diff=8770"/>
		<updated>2026-03-10T18:17:45Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Quartus versions to use with different projects */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Useful Links ==&lt;br /&gt;
&lt;br /&gt;
TBW&lt;br /&gt;
&lt;br /&gt;
== How to run Quartus ==&lt;br /&gt;
&lt;br /&gt;
=== Quartus versions to use with different projects ===&lt;br /&gt;
&lt;br /&gt;
* cyclone I: VF48, VME-NIMIO32, etc: /daq/quartus/13.0sp1/quartus/bin/quartus on U-20&lt;br /&gt;
* cyclone III: PPG32, etc: /daq/quartus/13.1.4.182/quartus/bin/quartus on U-20&lt;br /&gt;
* cyclone IV: gpmc-camac-aux-firmware (CAMAC interface): quartus 23.1&lt;br /&gt;
* cyclone V: ALPHA-g PWB, ALPHA-g ADC: quartus 17.0 (17.1 and newer have incompatible NIOS ethernet interface)&lt;br /&gt;
* cyclone V SoC: chronobox: 21.1&lt;br /&gt;
* cyclone V: VME-NIMIO32-Rev3: 20.1&lt;br /&gt;
* stratix IV: ALPHA-g TRG: quartus 20.1.1&lt;br /&gt;
* max V: ALPHA-g TRG: quartus 20.1.1&lt;br /&gt;
&lt;br /&gt;
=== Available versions of Quartus ===&lt;br /&gt;
&lt;br /&gt;
* ls -l /daq/quartus (mount -o ro daq00:/quartus /daq/quartus and mount -o ro daqstore.triumf.ca:/pool/daqstore /daq/daqstore)&lt;br /&gt;
&lt;br /&gt;
Archive of quartus distribution files:&lt;br /&gt;
&lt;br /&gt;
* /daq/quartus_archive (mount -o ro daqstore:/z6tb/quartus_archive)&lt;br /&gt;
&lt;br /&gt;
=== Select a quartus license ===&lt;br /&gt;
&lt;br /&gt;
* daq01 license, ubuntu-20.04: start license server: &amp;quot;ssh daq01 /opt/intelFPGA/20.1/quartus/linux64/lmgrd -c /home/olchansk/daq/altera/license-daq01.dat&amp;quot;&lt;br /&gt;
* daq13 license, ubuntu-20.04: start license server: &amp;quot;ssh daq13 /opt/intelFPGA/20.1/quartus/linux64/lmgrd -c /home/olchansk/daq/altera/license-daq13.dat&amp;quot;&lt;br /&gt;
* daq16 license, centos-7: start license server: &amp;quot;ssh daq16 /daq/quartus/16.1/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-daq16.dat&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* (temp not available) ladd05 nodelocked license: run quartus on ladd05, use license file /home/olchansk/daq/altera/license-ladd05.dat&lt;br /&gt;
* (temp not available) ladd01 nodelocked license: run quartus on ladd01, use license file /home/olchansk/daq/altera/license-ladd01.dat&lt;br /&gt;
* (temp not available) daqshare floating license: start license server: &amp;quot;ssh daqshare /daq/daqshare/olchansk/altera/13.1.3.178/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-daqshare.dat&amp;quot;, run quartus anywhere, use license file /home/olchansk/daq/altera/license-daqshare.dat&lt;br /&gt;
* (temp not available) ladd09 floating license: start license server: &amp;quot;ssh ladd09 /daq/daqshare/olchansk/altera/12.0/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-ladd09.dat&amp;quot;, run quartus anywhere, use license file /home/olchansk/daq/altera/license-ladd09.dat&lt;br /&gt;
* (temp not available) ladd12 floating license: start license server: &amp;quot;ssh ladd12 /daq/daqshare/olchansk/altera/12.0/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-ladd12.dat&amp;quot;, run quartus anywhere, use license file /home/olchansk/daq/altera/license-ladd12.dat&lt;br /&gt;
* (moved to alpha03, use license-alpha03.dat) daq19 floating license: start license server: &amp;quot;ssh -n tigress@daq19 /daq/daqshare/olchansk/altera/12.0/quartus/linux/lmgrd -c /home/olchansk/daq/altera/license-daq19.dat &amp;amp;&amp;quot;, run quartus anywhere, use license file /home/olchansk/daq/altera/license-daq19.dat&lt;br /&gt;
&lt;br /&gt;
=== Mac addresses ===&lt;br /&gt;
&lt;br /&gt;
* old ladd01/daqshare license: 00:1e:8c:7c:ff:03&lt;br /&gt;
* old ladd01 nodelocked license: 00:30:48:76:2e:42 00:30:48:76:2e:43&lt;br /&gt;
* old ladd09 license: 00:13:d4:92:5e:a3&lt;br /&gt;
* old ladd12 license: 00:1c:c0:fa:be:df&lt;br /&gt;
* old ladd19/daq19 license: 10:bf:48:4e:1e:89&lt;br /&gt;
&lt;br /&gt;
=== Ubuntu Caveats ===&lt;br /&gt;
&lt;br /&gt;
* Ubuntu LTS 20.04&lt;br /&gt;
* /opt/intelFPGA/17.0/quartus/bin/jtagconfig does not work, killall -KILL jtagd and use /daq/quartus/13.0sp1/quartus/bin/jtagconfig, then jtag works.&lt;br /&gt;
&lt;br /&gt;
=== (OBSOLETE) SL/CentOS Caveats ===&lt;br /&gt;
&lt;br /&gt;
* If Quartus 13.1 crashes on startup, see this: http://www.altera.com/support/kdb/solutions/rd12102013_780.html&lt;br /&gt;
&lt;br /&gt;
* If Quartus 13.0, 13.1, etc crashes on startup with error about &amp;quot;SSL_library_init&amp;quot;, see https://www.altera.com/support/support-resources/knowledge-base/solutions/rd12102013_780.html. Solution is to verify presence of &amp;quot;/usr/lib64/libcrypto.so.0.9.8e&amp;quot;, erase it with &amp;quot;rpm --erase openssl098e&amp;quot;, then verify it has been erased.&lt;br /&gt;
&lt;br /&gt;
== Interfacing with hardware ==&lt;br /&gt;
&lt;br /&gt;
* To download pof files into VME modules with Active Serial EPROMs (i.e. VF48 modules): see /home/olchansk/daq/vf48/firmware/load.perl&lt;br /&gt;
* To download pof files into VME modules with VME-accessible Flash Programmer (VF48, etc) use the &amp;quot;srunner_vme&amp;quot; program, see /home/olchansk/packages/vme/srunner*&lt;br /&gt;
* To download sof files into VME modules using JTAG interface, see /home/olchansk/daq/vf48/firmware/load_jtag_fe.perl&lt;br /&gt;
&lt;br /&gt;
== Accessing USB-Blaster attached to remote computer ==&lt;br /&gt;
&lt;br /&gt;
=== Using JTAGD 2025-OCT ===&lt;br /&gt;
&lt;br /&gt;
* DE10 is attached to daq17, quartus runs on dsdaqgw&lt;br /&gt;
&lt;br /&gt;
open termiminal on machine where usb blaster is attached:&lt;br /&gt;
* run jtagconfig to confirm usb blaster is attached correctly:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq17:~$ /daq/quartus/21.1/quartus/bin/jtagconfig&lt;br /&gt;
1) DE-SoC [3-4]                               &lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
2) Remote server daq16: Unable to connect&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* killall -KILL jtagd&lt;br /&gt;
* echo &#039;Password = &amp;quot;123&amp;quot;;&#039; &amp;gt;&amp;gt; ~/.jtagd.conf&lt;br /&gt;
* /daq/quartus/21.1/quartus/bin/jtagd --user-start&lt;br /&gt;
* lsof -P | grep jtagd | grep IP ### note jtagd port number, usually 1309, note it is bound to localhost, we will need to use a tcp tunnel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
jtagd     3839700                               olchansk    4u     IPv4          531471689       0t0       TCP localhost:1309 (LISTEN)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* /daq/quartus/21.1/quartus/bin/jtagconfig ### should still work&lt;br /&gt;
&lt;br /&gt;
open a terminal to run the ssh tunnel:&lt;br /&gt;
* login to the remote machine where we will run quartus compilations and quartus signal tap&lt;br /&gt;
* ssh dsdaqgw&lt;br /&gt;
* ps -efw | grep jtagd, kill all copies of jtagd already running. may have to close signaltap if it is already open&lt;br /&gt;
* ssh -v daq17 -L1309:127.0.0.1:1309&lt;br /&gt;
&lt;br /&gt;
open a terminal to run quartus and signal tap&lt;br /&gt;
* ssh dsdaqgw, cd git/chronobox_firmware, run quartus setup scripts from Makefile&lt;br /&gt;
* ncat localhost 1309 # should reply with &amp;quot;JTAG Server&amp;quot; and the other terminal should report tunnel connection on port 1309&lt;br /&gt;
* run jtagconfig&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsdaqgw:chronobox_firmware$ jtagconfig&lt;br /&gt;
1) DE-SoC [3-4]&lt;br /&gt;
  4BA00477   SOCVHPS&lt;br /&gt;
  02D020DD   5CSEBA6(.|ES)/5CSEMA6/..&lt;br /&gt;
&lt;br /&gt;
dsdaqgw:chronobox_firmware$ &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if jtagconfig reports &amp;quot;Error when scanning hardware - Server error&amp;quot;, check that jtagd is still running on daq17, restart it if it does not.&lt;br /&gt;
* from here remote usb blaster should work same as the local one (signal tap, etc)&lt;br /&gt;
&lt;br /&gt;
=== Using JTAGD (obsolete) ===&lt;br /&gt;
&lt;br /&gt;
* install jtagd system files per [[SLinstall#Configure_Altera_jtagd]]&lt;br /&gt;
* this sets the jtagd password to &amp;quot;123&amp;quot;&lt;br /&gt;
* ssh to the machine where the USB-Blaster is connected&lt;br /&gt;
* start local jtagd: /daq/daqshare/olchansk/altera/11.0/quartus/bin/jtagd&lt;br /&gt;
* NOTE: jtagd from .../quartus/linux64/jtagd will not run, please use .../quartus/bin/jtagd&lt;br /&gt;
* test local connection: /daq/daqshare/olchansk/altera/11.0/quartus/bin/jtagconfig&lt;br /&gt;
* add this machine to $HOME/.jtag.conf: (replace &amp;quot;laddvme05&amp;quot; with the name of the machine where the USB blaster is attached)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /home/olchansk/.jtag.conf&lt;br /&gt;
Remote2 {&lt;br /&gt;
	Host = &amp;quot;laddvme05&amp;quot;;&lt;br /&gt;
	Password = &amp;quot;123&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test remote connection: run jtagconfig, now your device should show up two times - first for the local USB connection and second for the remote jtagd connection&lt;br /&gt;
* go to your quartus machine, start quartus, open your project file&lt;br /&gt;
* open tools-&amp;gt;programmer&lt;br /&gt;
* open hardware setup, you should see an entry for your jtag connection&lt;br /&gt;
* use the remote jtag connection the same way as a local jtag connection.&lt;br /&gt;
&lt;br /&gt;
=== Using SSH tunnel ===&lt;br /&gt;
&lt;br /&gt;
To access USB-Blaster Jtag interface attached to a remote computer: (from https://ladd00.triumf.ca/elog/DAS/437)&lt;br /&gt;
 &lt;br /&gt;
Assume we have the USB blaster connected to laddvme05 (target) and we will run quartus on ladd00 (quartus host)&lt;br /&gt;
* login to ladd00&lt;br /&gt;
* get rid of possibly running local jtagd processes: killall -KILL jtagd&lt;br /&gt;
* start the ssh tunnel: ssh laddvme05 -L1309:127.0.0.1:1309&lt;br /&gt;
* inside the ssh tunnel (on the target machine) start the jtagd daemon: jtagd --user-start (assuming quartus tools are in your $PATH, otherwise use full pathnames, i.e. /triumfcs/trshare/olchansk/altera/altera9.1/quartus/bin/jtagd --user-start)&lt;br /&gt;
* inside the ssh tunnel (on the target machine) check that jtag local connection works: jtagconfig&lt;br /&gt;
* if jtagconfig does not work, check permissions on the /proc/bus/usb/*/* devices, they should be &amp;quot;rw-rw-rw&amp;quot;. If they are not, fix them by hand: login as root and run &amp;quot;chmod a+wr /proc/bus/usb/*/*&amp;quot; or follow the instructions for changing default usb permissions at https://www.triumf.info/wiki/DAQwiki/index.php/SLinstall&lt;br /&gt;
* leave the ssh tunnel window alone (iconize it)&lt;br /&gt;
* login to ladd00&lt;br /&gt;
* again get rid of possibly running local jtagd processes: killall -KILL jtagd&lt;br /&gt;
* go to the quartus project directory, start quartus, open the quartus project&lt;br /&gt;
* start the jtag progammer from &amp;quot;quartus -&amp;gt; tools -&amp;gt; programmer&amp;quot;&lt;br /&gt;
* start the jtag signal  tap tool from &amp;quot;quartus -&amp;gt; tools -&amp;gt; signal tap II logic analyzer&amp;quot;&lt;br /&gt;
* in either place, you should see the USB blaster is if it were locally connected.&lt;br /&gt;
&lt;br /&gt;
Troubleshooting:&lt;br /&gt;
&lt;br /&gt;
if remote jtag connection does not work, try this, report the results:&lt;br /&gt;
* jtagconfig on the machine where the USB blaster is locally connected should see the jtag devices. Typical malfunctions are wrong permissions on the USB files (fix as described above) and stale/bad jtagd running (kill it, restart it)&lt;br /&gt;
* local jtagd should talk to us: &amp;quot;telnet localhost 1309&amp;quot; should report &amp;quot;JTAG Server&amp;quot;&lt;br /&gt;
* ssh tunnel should be running (ssh -L)&lt;br /&gt;
* the tunnel should work (on the other end of the tunnel, i.e. on ladd00), &amp;quot;telnet localhost 1309&amp;quot; should report &amp;quot;JTAG Server&amp;quot;&lt;br /&gt;
jtagconfig should see the same devices&lt;br /&gt;
&lt;br /&gt;
== Notes ==&lt;br /&gt;
&lt;br /&gt;
=== Enable 64-bit by default ===&lt;br /&gt;
&lt;br /&gt;
* edit .../quartus/adm/qenv.sh to read: - add one line as indicated:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
##### Check if should use 64-bit executables &lt;br /&gt;
 &lt;br /&gt;
unset USE_64BIT &lt;br /&gt;
# If we are on a 64-bit system, use 64-bit if QUARTUS_64BIT is set and != 0 &lt;br /&gt;
# Also use it if we are running jtagd, since it interacts with hardware it must\&lt;br /&gt;
 always match the OS &lt;br /&gt;
if test $QUARTUS_BIT_TYPE = &amp;quot;64&amp;quot; ; then &lt;br /&gt;
        USE_64BIT=1 ### &amp;lt;---------------------------------------------- add this line&lt;br /&gt;
        if test &amp;quot;$CMD_NAME&amp;quot; = &amp;quot;jtagd&amp;quot; ; then &lt;br /&gt;
                USE_64BIT=1 &lt;br /&gt;
        elif test &amp;quot;${QUARTUS_64BIT-UNSET}&amp;quot; != UNSET ; then &lt;br /&gt;
                if test $QUARTUS_64BIT != &amp;quot;0&amp;quot; ; then &lt;br /&gt;
                        USE_64BIT=1 &lt;br /&gt;
                fi &lt;br /&gt;
        fi &lt;br /&gt;
fi &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Debug the license server ===&lt;br /&gt;
&lt;br /&gt;
* show available hostid:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ /daq/daqshare/olchansk/altera/12.1/quartus/linux/lmutil lmhostid&lt;br /&gt;
lmutil - Copyright (c) 1989-2008 Acresso Software Inc. All Rights Reserved.&lt;br /&gt;
The FLEXnet host ID of this machine is &amp;quot;&amp;quot;00167639501b 0013d4925ea3&amp;quot;&amp;quot;&lt;br /&gt;
Only use ONE from the list of hostids.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* fudge the hostid:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ip link set dev eth3 address 00:13:D4:92:5E:A3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
or&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe bonding&lt;br /&gt;
echo +bond0 &amp;gt; /sys/class/net/bonding_masters&lt;br /&gt;
ifconfig bond0&lt;br /&gt;
ip link set dev bond0 address 00:13:D4:92:5E:A3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=MUSR_Cluster&amp;diff=8768</id>
		<title>MUSR Cluster</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=MUSR_Cluster&amp;diff=8768"/>
		<updated>2026-02-28T04:30:01Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* CMMS VLAN migration */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Links ==&lt;br /&gt;
&lt;br /&gt;
* http://musr00.triumf.ca/triumf_nodeinfo/config.html (node info)&lt;br /&gt;
* http://musr00.triumf.ca/quotareport/quota.html (musr00 disk quota report)&lt;br /&gt;
* http://ladd00.triumf.ca/ganglia/ (ganglia on ladd00)&lt;br /&gt;
&lt;br /&gt;
== DAQ machines ==&lt;br /&gt;
&lt;br /&gt;
* musr00: main server (NIS, home directories, central services, etc - see below)&lt;br /&gt;
* musr01: M15 user analysis&lt;br /&gt;
* musr02: M20 user analysis&lt;br /&gt;
* midm20: old M20 DAQ&lt;br /&gt;
* midm9a: inactive M9A DAQ, used for daq development&lt;br /&gt;
* midm15: M15 DAQ&lt;br /&gt;
* midm20c: M20C DAQ&lt;br /&gt;
* midm20d: M20D DAQ&lt;br /&gt;
* m15vw: M15 CAMP&lt;br /&gt;
* m9bvw: M20 CAMP (C or D)&lt;br /&gt;
* m20vw: M20 CAMP (D or C)&lt;br /&gt;
* lxm9a: Linux VME DAQ, dhcp: ladd00, tftp: ladd00, nfsroot: musr00&lt;br /&gt;
* lxm9b: Linux VME DAQ, dhcp: ladd00, tftp: ladd00, nfsroot: musr00&lt;br /&gt;
* lxm15: Linux VME DAQ, dhcp, tftp, nfsroot: midm15&lt;br /&gt;
* lxm20c: Linux VME DAQ, dhcp, tftp: ladd00, nfsroot: midm20c&lt;br /&gt;
* lxm20d: Linux VME DAQ, dhcp, tftp: ladd00, nfsroot: midm20d&lt;br /&gt;
&lt;br /&gt;
== MUSR00 services ==&lt;br /&gt;
&lt;br /&gt;
* NIS master (MUSR-NIS)&lt;br /&gt;
* home directories&lt;br /&gt;
* NFS for OS images of ISAC V7648/V7750 VME CPUs (lxEXPT machines)&lt;br /&gt;
* web server: http://musr00.triumf.ca&lt;br /&gt;
* nodeinfo for MUSR machines&lt;br /&gt;
&lt;br /&gt;
== NIS configuration ==&lt;br /&gt;
&lt;br /&gt;
* domainname MUSR-NIS&lt;br /&gt;
* master: xxx&lt;br /&gt;
* secondary: xxx&lt;br /&gt;
* autofs/automount configuration: musr00:/etc files auto.master, auto.home, auto.musr, auto.daq&lt;br /&gt;
** after editing autofs files, run:&lt;br /&gt;
** cd ~root&lt;br /&gt;
** make -C /var/yp&lt;br /&gt;
** ./all.perl service autofs reload&lt;br /&gt;
&lt;br /&gt;
== NFS configuration ==&lt;br /&gt;
&lt;br /&gt;
* /isdaq/dataNNN - shared data disks&lt;br /&gt;
* /musr/xxx - BNMR/BNQR data disks&lt;br /&gt;
&lt;br /&gt;
== MUSR account summary ==&lt;br /&gt;
&lt;br /&gt;
* /home for local disks, /home1 for NFS directories.&lt;br /&gt;
* musrdaq/msrorg are NIS but not NFS. Local directory in /home on each machine. msrorg exists on musr01/musr02 analysis machines as well!&lt;br /&gt;
* m15/m20c/eXXX/... are NIS and NFS. Most hosted on musr00, but m20c hosted on /home in midm20c etc. &lt;br /&gt;
* lx machines mount /home1 from relevant midm machine (vis fstab) to get access to musrdaq code. Nothing in /home for them.&lt;br /&gt;
&lt;br /&gt;
== CMMS VLAN ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
IP address range: 142.90.154.x, 1..253&lt;br /&gt;
gateway 142.90.154.254&lt;br /&gt;
subnet mask 255.255.255.0&lt;br /&gt;
prefix 24&lt;br /&gt;
DNS server: 142.90.100.19 (for now)&lt;br /&gt;
DHCP server: midm15&lt;br /&gt;
DHCP server: midm9a (for lxm9a and lxm9b in the daq lab)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Labeling:&lt;br /&gt;
&lt;br /&gt;
* network outlets and network switches are labeled &amp;quot;CMMS VLAN 142.90.152.x&amp;quot; using blue-on-white labeling tape&lt;br /&gt;
* network devices configured for use on the CMMS VLAN: &amp;quot;midm20c/142.90.154.195&amp;quot; using blue-on-white labeling tape&lt;br /&gt;
&lt;br /&gt;
== CMMS VLAN migration ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DAQ LAB outlet 243-8&lt;br /&gt;
lxm9a      142.90.111.101 -&amp;gt; 142.90.154.101 - done&lt;br /&gt;
lxm9b      142.90.111.102 -&amp;gt; 142.90.154.102 - done&lt;br /&gt;
midm9a     142.90.101.163 -&amp;gt; 142.90.154.76  - done - added dhcp for lxm9a, lxm9b&lt;br /&gt;
midm9b     142.90.101.72 -&amp;gt;  142.90.154.72  - done&lt;br /&gt;
&lt;br /&gt;
XXX&lt;br /&gt;
musr00     142.90.119.219 -&amp;gt; 142.90.154.219 - done&lt;br /&gt;
musr01     142.90.102.31  -&amp;gt; 142.90.154.31 - done&lt;br /&gt;
musr02     142.90.102.32  -&amp;gt; 142.90.154.32 - done&lt;br /&gt;
musr03     142.90.102.33  -&amp;gt; 142.90.154.33 - done&lt;br /&gt;
(midm20)   142.90.101.74&lt;br /&gt;
&lt;br /&gt;
muser1 .126.13 -&amp;gt; 142.90.154.113 - done renumbered .13 to .113, conflict with m15crtv&lt;br /&gt;
muser2 .126.19&lt;br /&gt;
muser3 .126.24&lt;br /&gt;
muser4 .126.28&lt;br /&gt;
jhb .112.43 -&amp;gt; 142.90.154.43 - done&lt;br /&gt;
&lt;br /&gt;
M15&lt;br /&gt;
midm15      142.90.101.73  -&amp;gt; 142.90.154.73  - done&lt;br /&gt;
lxm15       142.90.111.103 -&amp;gt; 142.90.154.103 - done&lt;br /&gt;
m15vw       142.90.102.3   -&amp;gt; 142.90.154.108 - done - renumbered .3 to .108&lt;br /&gt;
m15hv01     142.90.102.14  -&amp;gt; 142.90.154.14  - done&lt;br /&gt;
las14       142.90.126.7   -&amp;gt; 142.90.154.7   - done&lt;br /&gt;
muhtr1      142.90.109.122 -&amp;gt; 142.90.154.122 - done&lt;br /&gt;
mupress01   142.90.101.151 -&amp;gt; 142.90.154.151 - done&lt;br /&gt;
mulaket03   142.90.126.133 -&amp;gt; 142.90.154.133 - done&lt;br /&gt;
drtempm15   142.90.126.124 -&amp;gt; 142.90.154.124 - done&lt;br /&gt;
bnqrlt      142.90.126.53  -&amp;gt; 142.90.154.53  - done&lt;br /&gt;
m15crtv x -&amp;gt; 142.90.154.13 - done, in dns&lt;br /&gt;
&lt;br /&gt;
musoren01   142.90.101.141 -&amp;gt; 142.90.154.141 - done&lt;br /&gt;
musoren02   142.90.101.142 -&amp;gt; 142.90.154.142 - done&lt;br /&gt;
musoren03   142.90.101.143 -&amp;gt; 142.90.154.143 - done&lt;br /&gt;
musoren04   142.90.101.144 -&amp;gt; 142.90.154.144 - done&lt;br /&gt;
musoren05   142.90.101.145 -&amp;gt; 142.90.154.145 - done&lt;br /&gt;
musoren06   142.90.101.146 -&amp;gt; 142.90.154.146 - done&lt;br /&gt;
&lt;br /&gt;
mulaket01 142.90.126.131 -&amp;gt; .131 - done&lt;br /&gt;
mulaket02 142.90.126.132 -&amp;gt; .132 - done&lt;br /&gt;
mulaket03 142.90.126.133 -&amp;gt; .133 - done&lt;br /&gt;
mulaket04 .134 - bnmr/bnqr&lt;br /&gt;
mulaket05 .135 - bnmr/bnqr&lt;br /&gt;
mulaket06 .136 - &lt;br /&gt;
mulaket07 .137&lt;br /&gt;
mulaket08 .138&lt;br /&gt;
&lt;br /&gt;
mucamp2    142.90.126.39&lt;br /&gt;
&lt;br /&gt;
MUSR (RMC) CR&lt;br /&gt;
midm20c    142.90.101.195 -&amp;gt; 142.90.154.195 - done&lt;br /&gt;
midm20d    142.90.101.196 -&amp;gt; 142.90.154.196 - done&lt;br /&gt;
lxm20c     142.90.106.205 -&amp;gt; 142.90.154.205 - done&lt;br /&gt;
lxm20d     142.90.106.206 -&amp;gt; 142.90.154.206 - done&lt;br /&gt;
(m9avw)    142.90.109.166 -&amp;gt; 142.90.154.109 - done - renumbered&lt;br /&gt;
m9bvw      142.90.101.48  -&amp;gt; 142.90.154.110 - done - renumbered - crashes soon after boot&lt;br /&gt;
m20vw      142.90.101.27  -&amp;gt; 142.90.154.111 - done - renumbered&lt;br /&gt;
m9hv01     142.90.111.76  -&amp;gt; 142.90.154.17  - done - renumbered due to collision with midm9a&lt;br /&gt;
m20hv01    142.90.101.60  -&amp;gt; 142.90.154.60  - done&lt;br /&gt;
mutest     142.90.126.91  -&amp;gt; 142.90.154.91  - done&lt;br /&gt;
las77      142.90.111.25  -&amp;gt; 142.90.154.25  - done&lt;br /&gt;
muscopem20 142.90.126.50  -&amp;gt; 142.90.154.50  - done&lt;br /&gt;
m9 vme crate - m9vc .252 - done (not in DNS) -&amp;gt; .9 - done&lt;br /&gt;
m20 vme crate - m20vc .251 - done (not in DNS) -&amp;gt; .10 - done&lt;br /&gt;
m20crtv .253 - done (not in DNS) -&amp;gt; .11 - done&lt;br /&gt;
&lt;br /&gt;
BNMR/BNQR&lt;br /&gt;
lxbnmr     142.90.123.24  -&amp;gt; 104 renumber&lt;br /&gt;
lxbnqr     142.90.123.25  -&amp;gt; 105 renumber&lt;br /&gt;
polvw      142.90.127.139 -&amp;gt; 106 renumber&lt;br /&gt;
bnmrvw     142.90.127.48  -&amp;gt; 107 renumber&lt;br /&gt;
daqfire1   142.90.105.89 -&amp;gt; 89&lt;br /&gt;
daqfire2   142.90.105.90 -&amp;gt; 90&lt;br /&gt;
bnmrcon1   142.90.127.119 -&amp;gt; 119&lt;br /&gt;
polcon1    142.90.127.162 -&amp;gt; 162&lt;br /&gt;
&lt;br /&gt;
bnmrhv01 .127.118 -&amp;gt; 118&lt;br /&gt;
&lt;br /&gt;
bnmrexp .126.94 -&amp;gt; 94&lt;br /&gt;
bnqrexp .126.95 -&amp;gt; 95&lt;br /&gt;
&lt;br /&gt;
Newly allocated IP addresses:&lt;br /&gt;
&lt;br /&gt;
lxmusr3t 142.90.154.8 - done&lt;br /&gt;
m9vc 142.90.154.9 - done&lt;br /&gt;
m20vc 142.90.154.10 - done&lt;br /&gt;
m20crtv 142.90.154.11 - done&lt;br /&gt;
m9crtv 142.90.154.12 - done&lt;br /&gt;
muamips1 142.90.126.110 -&amp;gt; 142.90.154.127 - done&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Old IP addresses to be removed&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
midm15old&lt;br /&gt;
midm15x&lt;br /&gt;
midm15y&lt;br /&gt;
igeldaq&lt;br /&gt;
igelm15&lt;br /&gt;
igelm20&lt;br /&gt;
igelm9b&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Sysman&amp;diff=8767</id>
		<title>Sysman</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Sysman&amp;diff=8767"/>
		<updated>2026-02-27T23:51:46Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Computer clusters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== System management ==&lt;br /&gt;
&lt;br /&gt;
* [http://daq-plone.triumf.ca/SM/docs/local Misc documentation on the daq-plone site]&lt;br /&gt;
* [[Daqinv]] DAQ inventory database&lt;br /&gt;
* [[Amanda]] AMANDA backups&lt;br /&gt;
&lt;br /&gt;
== Computer clusters ==&lt;br /&gt;
&lt;br /&gt;
* [[DAQ_Cluster]] [[ISAC_Cluster]] [[MUSR_Cluster]] [http://www.triumf.info/wiki/DAQwiki/index.php/TITAN TITAN]&lt;br /&gt;
* gonodeinfo: [https://daq00.triumf.ca/gonodeinfo/gonodereport.html all] [https://daq00.triumf.ca/gonodeinfo/group-titan.html titan] [https://daq00.triumf.ca/gonodeinfo/group-isac.html isac] [https://daq00.triumf.ca/gonodeinfo/group-cmms.html cmms] (username/password: midas/midas)&lt;br /&gt;
* gonodeinfo: [https://dsvslice.triumf.ca/gonodeinfo/gonodereport.html dsvslice] (username/password: midas/midas)&lt;br /&gt;
* [https://daq00.triumf.ca/ganglia-el7/ ganglia] (username/password: midas/midas) (runs on kvm-el7, see kvm-el7:/etc/rc.local)&lt;br /&gt;
* [https://daq00.triumf.ca/ganglia new ganglia] (username/password: midas/midas) (runs on daq00)&lt;br /&gt;
* zfsquotareport: [https://daq00.triumf.ca/zfsquotareport/zfsquota.html daq00] [https://isdaq00.triumf.ca/zfsquotareport/zfsquota.html isdaq00] [https://alpha00.triumf.ca/zfsquotareport/zfsquota.html alpha00] [musr00] [midm9a] [https://iris00.triumf.ca/zfsquotareport/zfsquota.html iris00] [https://midemma01.triumf.ca/zfsquotareport/zfsquota.html midemma01] [https://trinatdaq.triumf.ca/zfsquotareport/zfsquota.html trinatdaq] [titan00] [https://daqstore.triumf.ca/zfsquotareport/zfsquota.html daqstore] [https://alphacpc05.cern.ch/zfsquotareport/zfsquota.html alphasuperdaq]&lt;br /&gt;
* [https://ladd00.triumf.ca/diskusers/disks.html Diskusers] &lt;br /&gt;
* [https://daq00.triumf.ca/~olchansk/pingmon/triumf.html network ping monitor]&lt;br /&gt;
* [https://daq00.triumf.ca/~daqweb/daqbackup/ daqbackup]&lt;br /&gt;
&lt;br /&gt;
* TRDATA dcache status [[TrdataDcache]]&lt;br /&gt;
* [[DiskScrub]] Documentation for diskscrub&lt;br /&gt;
* [[disk_benchmarks]]&lt;br /&gt;
* [[graphics_benchmarks]]&lt;br /&gt;
* [[VMs]] DAQ VMs&lt;br /&gt;
&lt;br /&gt;
== Linux documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[SLinstall]] SL5/SL6/CentOS7/CentOS8 install instructions&lt;br /&gt;
* [[Ubuntu]] Ubuntu install instructions&lt;br /&gt;
* [[Raspbian]] Raspbian OS for ARM processors (Raspberry Pi, Cyclone5 SoC, etc)&lt;br /&gt;
* [[ZFS]] ZFS instructions&lt;br /&gt;
* [[rPi-RT]] Real-Time kernel for Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
== MacOS documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[MacOS]] MacOS instructions&lt;br /&gt;
&lt;br /&gt;
== Misc documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[DaqVlanConfig]] VLANs for DAQ and experiments&lt;br /&gt;
* [[PcHardware]] DAQ PC Configurations&lt;br /&gt;
* [[PcRackmount]] DAQ Rackmounted Configurations&lt;br /&gt;
* [[DaqSvn]] DAQ SVN repositories and instructions (obsolete)&lt;br /&gt;
* [[Quartus]] Altera Quartus&lt;br /&gt;
* [[HADOOP]] (obsolete)&lt;br /&gt;
* [[EPICS]]&lt;br /&gt;
* [[VNC]]&lt;br /&gt;
* [[Cloning_raid1_boot_disks]]&lt;br /&gt;
* [[Setup_MIDAS_experiment]] (moved to MidasWiki)&lt;br /&gt;
* [[IEEE_MAC_TRIUMF]] IEEE MAC addresses assigned to TRIUMF&lt;br /&gt;
* [[DaqWikiManagement]] DAQWiki management&lt;br /&gt;
* [[PHYSICA]]&lt;br /&gt;
* [[ROOT]]&lt;br /&gt;
* [[MIDAS]]&lt;br /&gt;
* [[ROOTANA]] : ROOT Analyzer for MIDAS (moved to MidasWiki)&lt;br /&gt;
* [[ROODY]]&lt;br /&gt;
* [[ser2net]] USB-Serial-RS232 interface&lt;br /&gt;
* [[GIT]]&lt;br /&gt;
* [[TrdataDcache]] tradata dcache system for experimental data storage&lt;br /&gt;
* [[dhcpd_on_eth1]] Enabling dhcpd on secondary ethernet port&lt;br /&gt;
* [[nextcloud]]&lt;br /&gt;
* [[DAQ_VMs]] DAQ and experimental group VMs&lt;br /&gt;
* [[MegaRAID]] instructions for dealing with MegaRAID hardware raid adapters&lt;br /&gt;
* obsolete data acquisition software: [https://daq.triumf.ca/~daqweb/doc/susiq/ SUSIQ] [https://daq.triumf.ca/~daqweb/doc/nova/ NOVA]&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Sysman&amp;diff=8766</id>
		<title>Sysman</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Sysman&amp;diff=8766"/>
		<updated>2026-02-27T23:51:26Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Computer clusters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== System management ==&lt;br /&gt;
&lt;br /&gt;
* [http://daq-plone.triumf.ca/SM/docs/local Misc documentation on the daq-plone site]&lt;br /&gt;
* [[Daqinv]] DAQ inventory database&lt;br /&gt;
* [[Amanda]] AMANDA backups&lt;br /&gt;
&lt;br /&gt;
== Computer clusters ==&lt;br /&gt;
&lt;br /&gt;
* [[DAQ_Cluster]] [[ISAC_Cluster]] [[MUSR_Cluster]] [http://www.triumf.info/wiki/DAQwiki/index.php/TITAN TITAN]&lt;br /&gt;
* gonodeinfo: [https://daq00.triumf.ca/gonodeinfo/gonodereport.html all] [https://daq00.triumf.ca/gonodeinfo/group-titan.html titan] [https://daq00.triumf.ca/gonodeinfo/group-isac.html isac] [https://daq00.triumf.ca/gonodeinfo/group-cmms.html cmms] (username/password: midas/midas)&lt;br /&gt;
* gonodeinfo: [https://dsvslice.triumf.ca/gonodeinfo/gonodereport.html dsvslice] (username/password: midas/midas)&lt;br /&gt;
* [https://daqstore.triumf.ca/ganglia ganglia] (username/password: midas/midas) (runs on daqstore, see daqstore:/etc/rc.local)&lt;br /&gt;
* [https://daq00.triumf.ca/ganglia-el7/ ganglia] (username/password: midas/midas) (runs on kvm-el7, see kvm-el7:/etc/rc.local)&lt;br /&gt;
* [https://daq00.triumf.ca/ganglia new ganglia] (username/password: midas/midas) (runs on daq00)&lt;br /&gt;
* zfsquotareport: [https://daq00.triumf.ca/zfsquotareport/zfsquota.html daq00] [https://isdaq00.triumf.ca/zfsquotareport/zfsquota.html isdaq00] [https://alpha00.triumf.ca/zfsquotareport/zfsquota.html alpha00] [musr00] [midm9a] [https://iris00.triumf.ca/zfsquotareport/zfsquota.html iris00] [https://midemma01.triumf.ca/zfsquotareport/zfsquota.html midemma01] [https://trinatdaq.triumf.ca/zfsquotareport/zfsquota.html trinatdaq] [titan00] [https://daqstore.triumf.ca/zfsquotareport/zfsquota.html daqstore] [https://alphacpc05.cern.ch/zfsquotareport/zfsquota.html alphasuperdaq]&lt;br /&gt;
* [https://ladd00.triumf.ca/diskusers/disks.html Diskusers] &lt;br /&gt;
* [https://daq00.triumf.ca/~olchansk/pingmon/triumf.html network ping monitor]&lt;br /&gt;
* [https://daq00.triumf.ca/~daqweb/daqbackup/ daqbackup]&lt;br /&gt;
&lt;br /&gt;
* TRDATA dcache status [[TrdataDcache]]&lt;br /&gt;
* [[DiskScrub]] Documentation for diskscrub&lt;br /&gt;
* [[disk_benchmarks]]&lt;br /&gt;
* [[graphics_benchmarks]]&lt;br /&gt;
* [[VMs]] DAQ VMs&lt;br /&gt;
&lt;br /&gt;
== Linux documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[SLinstall]] SL5/SL6/CentOS7/CentOS8 install instructions&lt;br /&gt;
* [[Ubuntu]] Ubuntu install instructions&lt;br /&gt;
* [[Raspbian]] Raspbian OS for ARM processors (Raspberry Pi, Cyclone5 SoC, etc)&lt;br /&gt;
* [[ZFS]] ZFS instructions&lt;br /&gt;
* [[rPi-RT]] Real-Time kernel for Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
== MacOS documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[MacOS]] MacOS instructions&lt;br /&gt;
&lt;br /&gt;
== Misc documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[DaqVlanConfig]] VLANs for DAQ and experiments&lt;br /&gt;
* [[PcHardware]] DAQ PC Configurations&lt;br /&gt;
* [[PcRackmount]] DAQ Rackmounted Configurations&lt;br /&gt;
* [[DaqSvn]] DAQ SVN repositories and instructions (obsolete)&lt;br /&gt;
* [[Quartus]] Altera Quartus&lt;br /&gt;
* [[HADOOP]] (obsolete)&lt;br /&gt;
* [[EPICS]]&lt;br /&gt;
* [[VNC]]&lt;br /&gt;
* [[Cloning_raid1_boot_disks]]&lt;br /&gt;
* [[Setup_MIDAS_experiment]] (moved to MidasWiki)&lt;br /&gt;
* [[IEEE_MAC_TRIUMF]] IEEE MAC addresses assigned to TRIUMF&lt;br /&gt;
* [[DaqWikiManagement]] DAQWiki management&lt;br /&gt;
* [[PHYSICA]]&lt;br /&gt;
* [[ROOT]]&lt;br /&gt;
* [[MIDAS]]&lt;br /&gt;
* [[ROOTANA]] : ROOT Analyzer for MIDAS (moved to MidasWiki)&lt;br /&gt;
* [[ROODY]]&lt;br /&gt;
* [[ser2net]] USB-Serial-RS232 interface&lt;br /&gt;
* [[GIT]]&lt;br /&gt;
* [[TrdataDcache]] tradata dcache system for experimental data storage&lt;br /&gt;
* [[dhcpd_on_eth1]] Enabling dhcpd on secondary ethernet port&lt;br /&gt;
* [[nextcloud]]&lt;br /&gt;
* [[DAQ_VMs]] DAQ and experimental group VMs&lt;br /&gt;
* [[MegaRAID]] instructions for dealing with MegaRAID hardware raid adapters&lt;br /&gt;
* obsolete data acquisition software: [https://daq.triumf.ca/~daqweb/doc/susiq/ SUSIQ] [https://daq.triumf.ca/~daqweb/doc/nova/ NOVA]&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Sysman&amp;diff=8765</id>
		<title>Sysman</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Sysman&amp;diff=8765"/>
		<updated>2026-02-27T23:13:25Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* Computer clusters */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== System management ==&lt;br /&gt;
&lt;br /&gt;
* [http://daq-plone.triumf.ca/SM/docs/local Misc documentation on the daq-plone site]&lt;br /&gt;
* [[Daqinv]] DAQ inventory database&lt;br /&gt;
* [[Amanda]] AMANDA backups&lt;br /&gt;
&lt;br /&gt;
== Computer clusters ==&lt;br /&gt;
&lt;br /&gt;
* [[DAQ_Cluster]] [[ISAC_Cluster]] [[MUSR_Cluster]] [http://www.triumf.info/wiki/DAQwiki/index.php/TITAN TITAN]&lt;br /&gt;
* gonodeinfo: [https://daq00.triumf.ca/gonodeinfo/gonodereport.html all] [https://daq00.triumf.ca/gonodeinfo/group-titan.html titan] [https://daq00.triumf.ca/gonodeinfo/group-isac.html isac] [https://daq00.triumf.ca/gonodeinfo/group-cmms.html cmms] (username/password: midas/midas)&lt;br /&gt;
* gonodeinfo: [https://dsvslice.triumf.ca/gonodeinfo/gonodereport.html dsvslice] (username/password: midas/midas)&lt;br /&gt;
* [https://daqstore.triumf.ca/ganglia ganglia] (username/password: midas/midas) (runs on daqstore, see daqstore:/etc/rc.local)&lt;br /&gt;
* [https://daq00.triumf.ca/ganglia-el7 ganglia] (username/password: midas/midas) (runs on kvm-el7, see kvm-el7:/etc/rc.local)&lt;br /&gt;
* [https://daq00.triumf.ca/ganglia new ganglia] (username/password: midas/midas) (runs on daq00)&lt;br /&gt;
* zfsquotareport: [https://daq00.triumf.ca/zfsquotareport/zfsquota.html daq00] [https://isdaq00.triumf.ca/zfsquotareport/zfsquota.html isdaq00] [https://alpha00.triumf.ca/zfsquotareport/zfsquota.html alpha00] [musr00] [midm9a] [https://iris00.triumf.ca/zfsquotareport/zfsquota.html iris00] [https://midemma01.triumf.ca/zfsquotareport/zfsquota.html midemma01] [https://trinatdaq.triumf.ca/zfsquotareport/zfsquota.html trinatdaq] [titan00] [https://daqstore.triumf.ca/zfsquotareport/zfsquota.html daqstore] [https://alphacpc05.cern.ch/zfsquotareport/zfsquota.html alphasuperdaq]&lt;br /&gt;
* [https://ladd00.triumf.ca/diskusers/disks.html Diskusers] &lt;br /&gt;
* [https://daq00.triumf.ca/~olchansk/pingmon/triumf.html network ping monitor]&lt;br /&gt;
* [https://daq00.triumf.ca/~daqweb/daqbackup/ daqbackup]&lt;br /&gt;
&lt;br /&gt;
* TRDATA dcache status [[TrdataDcache]]&lt;br /&gt;
* [[DiskScrub]] Documentation for diskscrub&lt;br /&gt;
* [[disk_benchmarks]]&lt;br /&gt;
* [[graphics_benchmarks]]&lt;br /&gt;
* [[VMs]] DAQ VMs&lt;br /&gt;
&lt;br /&gt;
== Linux documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[SLinstall]] SL5/SL6/CentOS7/CentOS8 install instructions&lt;br /&gt;
* [[Ubuntu]] Ubuntu install instructions&lt;br /&gt;
* [[Raspbian]] Raspbian OS for ARM processors (Raspberry Pi, Cyclone5 SoC, etc)&lt;br /&gt;
* [[ZFS]] ZFS instructions&lt;br /&gt;
* [[rPi-RT]] Real-Time kernel for Raspberry Pi&lt;br /&gt;
&lt;br /&gt;
== MacOS documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[MacOS]] MacOS instructions&lt;br /&gt;
&lt;br /&gt;
== Misc documentation ==&lt;br /&gt;
&lt;br /&gt;
* [[DaqVlanConfig]] VLANs for DAQ and experiments&lt;br /&gt;
* [[PcHardware]] DAQ PC Configurations&lt;br /&gt;
* [[PcRackmount]] DAQ Rackmounted Configurations&lt;br /&gt;
* [[DaqSvn]] DAQ SVN repositories and instructions (obsolete)&lt;br /&gt;
* [[Quartus]] Altera Quartus&lt;br /&gt;
* [[HADOOP]] (obsolete)&lt;br /&gt;
* [[EPICS]]&lt;br /&gt;
* [[VNC]]&lt;br /&gt;
* [[Cloning_raid1_boot_disks]]&lt;br /&gt;
* [[Setup_MIDAS_experiment]] (moved to MidasWiki)&lt;br /&gt;
* [[IEEE_MAC_TRIUMF]] IEEE MAC addresses assigned to TRIUMF&lt;br /&gt;
* [[DaqWikiManagement]] DAQWiki management&lt;br /&gt;
* [[PHYSICA]]&lt;br /&gt;
* [[ROOT]]&lt;br /&gt;
* [[MIDAS]]&lt;br /&gt;
* [[ROOTANA]] : ROOT Analyzer for MIDAS (moved to MidasWiki)&lt;br /&gt;
* [[ROODY]]&lt;br /&gt;
* [[ser2net]] USB-Serial-RS232 interface&lt;br /&gt;
* [[GIT]]&lt;br /&gt;
* [[TrdataDcache]] tradata dcache system for experimental data storage&lt;br /&gt;
* [[dhcpd_on_eth1]] Enabling dhcpd on secondary ethernet port&lt;br /&gt;
* [[nextcloud]]&lt;br /&gt;
* [[DAQ_VMs]] DAQ and experimental group VMs&lt;br /&gt;
* [[MegaRAID]] instructions for dealing with MegaRAID hardware raid adapters&lt;br /&gt;
* obsolete data acquisition software: [https://daq.triumf.ca/~daqweb/doc/susiq/ SUSIQ] [https://daq.triumf.ca/~daqweb/doc/nova/ NOVA]&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8764</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8764"/>
		<updated>2026-02-27T23:09:13Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* virsh commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install vim htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
on the main computer (daq00, dsdaqgw, etc)&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt update # update package list&lt;br /&gt;
* apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
* apt list &#039;~c&#039;&lt;br /&gt;
* apt purge &#039;~c&#039;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --all&lt;br /&gt;
&lt;br /&gt;
virsh start kvm-el7&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh install ...&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
virsh autostart kvm-ladd00&lt;br /&gt;
virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022.nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8763</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8763"/>
		<updated>2026-02-27T23:06:55Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* virsh commands */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install vim htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
on the main computer (daq00, dsdaqgw, etc)&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt update # update package list&lt;br /&gt;
* apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
* apt list &#039;~c&#039;&lt;br /&gt;
* apt purge &#039;~c&#039;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh list --allv&lt;br /&gt;
&lt;br /&gt;
irsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022.nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
	<entry>
		<id>https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8762</id>
		<title>Ubuntu</title>
		<link rel="alternate" type="text/html" href="https://daq00.triumf.ca/DaqWiki/index.php?title=Ubuntu&amp;diff=8762"/>
		<updated>2026-02-27T23:05:09Z</updated>

		<summary type="html">&lt;p&gt;Olchansk: /* KVM */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Prerequisites =&lt;br /&gt;
&lt;br /&gt;
* before setting up new machine run memory test&lt;br /&gt;
* prepare flash drive with free version of memtest86: https://www.memtest86.com&lt;br /&gt;
* test boot from flash drive, test takes ~ few hours&lt;br /&gt;
* test will end with summary page, if passed continue with Ubuntu&lt;br /&gt;
* number that might be worth noting is memory latency&lt;br /&gt;
&lt;br /&gt;
= Ubuntu version =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
lsb_release -a&lt;br /&gt;
uname -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu installer =&lt;br /&gt;
&lt;br /&gt;
* updated for Ububtu LTS 20.04.01, 22.04.1, 24.04 (only minor differences)&lt;br /&gt;
&lt;br /&gt;
* download the latest Ubuntu LTS desktop installer iso image&lt;br /&gt;
* dd the image to a USB key&lt;br /&gt;
* power down, disconnect all disks (all HDDs, all SSDs, all M.2)&lt;br /&gt;
* connect the SSD to be used as system disk&lt;br /&gt;
* if system will use mirrored SSDs (using ZFS mirror), leave second SSD disconnected, we will activate it later&lt;br /&gt;
* power up&lt;br /&gt;
* boot from USB key in legacy mode or UEFI mode (select this in the BIOS boot menu - F2 or F8 for ASUS, F11 for Supermicro)&lt;br /&gt;
* follow the instruction:&lt;br /&gt;
* &amp;quot;try ubuntu or install ubuntu&amp;quot; - choose &amp;quot;install&amp;quot;&lt;br /&gt;
* select language - accept default&lt;br /&gt;
* &amp;quot;updates and other software&amp;quot; - accept default settings (&amp;quot;normal install&amp;quot;)&lt;br /&gt;
* &amp;quot;installation type&amp;quot; - select &amp;quot;advanced features&amp;quot; and &amp;quot;experimental: use ZFS&amp;quot;&lt;br /&gt;
* accept partition choice&lt;br /&gt;
* &amp;quot;where are you?&amp;quot; - select &amp;quot;Vancouver&amp;quot; (PST time zone)&lt;br /&gt;
* &amp;quot;who are you?&amp;quot; - leave all fields blank, except &amp;quot;username&amp;quot; set to &amp;quot;wheel&amp;quot;, &amp;quot;password&amp;quot; set to the root password. hostname will be set later after configuring the network&lt;br /&gt;
* don&#039;t install third party sw&lt;br /&gt;
* installation runs in a few minutes, when finished, reboot&lt;br /&gt;
* login as user wheel&lt;br /&gt;
* answer annouying questions:&lt;br /&gt;
* &amp;quot;livepatch&amp;quot; - say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;help improve&amp;quot; - select &amp;quot;do not send&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;privacy&amp;quot; - leave &amp;quot;location&amp;quot; as &amp;quot;off&amp;quot;, say &amp;quot;next&amp;quot;&lt;br /&gt;
* &amp;quot;ready to go&amp;quot;, say &amp;quot;done&amp;quot;&lt;br /&gt;
* right-click on the desktop, say &amp;quot;open in terminal&amp;quot;, a shell will open&lt;br /&gt;
* say &amp;quot;sudo /bin/bash&amp;quot;, enter the root password, you now have the root shell&lt;br /&gt;
* run nm-connection-editor to configure the network. use netmask 255.255.224.0, gateway 142.90.100.18, DNS 142.90.100.19, search path &amp;quot;triumf.ca&amp;quot;&lt;br /&gt;
* after network is up (can ping ladd00), continue with post-installation steps below&lt;br /&gt;
&lt;br /&gt;
= Install instructions =&lt;br /&gt;
&lt;br /&gt;
== prepare ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ssh ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install ssh&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install git/scripts ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install git&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd scripts&lt;br /&gt;
git pull&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* if needed, update git/scripts repository from ladd00 to daq00:&lt;br /&gt;
* git remote -v ### if it says daq00, we are good&lt;br /&gt;
* git remote set-url origin https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
* git pull ### check that it works&lt;br /&gt;
&lt;br /&gt;
== configure hostname ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/hostname&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable swap ==&lt;br /&gt;
&lt;br /&gt;
ubuntu installer creates a 2 GB swap partition, not useful&lt;br /&gt;
on 32-64 GB machine, disable it:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
vi /etc/fstab ### comment out the &amp;quot;swap&amp;quot; line&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* on 64 GB RAM machines swap is not useful&lt;br /&gt;
* on machines booted from network (NFS-ROOT), swap does not work&lt;br /&gt;
* on machines running from flash (RPi, etc), flash is too slow for useful swap&lt;br /&gt;
* swap configured by linux installers invariably has wrong size and is not useful&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable dphys-swapfile&lt;br /&gt;
systemctl stop dphys-swapfile&lt;br /&gt;
dphys-swapfile uninstall&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== maybe reboot ==&lt;br /&gt;
&lt;br /&gt;
this is a good point to reboot the machine to boot&lt;br /&gt;
the latest kernel and to set the correct hostname&lt;br /&gt;
&lt;br /&gt;
== install etckeeper ==&lt;br /&gt;
&lt;br /&gt;
keep contents of /etc in a git repository:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install etckeeper&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== set timezone ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
timedatectl list-timezones | grep -i vancouver&lt;br /&gt;
timedatectl set-timezone America/Vancouver&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install time synchronization ==&lt;br /&gt;
&lt;br /&gt;
check if chrony is installed correctly and is synched to TRIUMF time servers:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if not, remove old chrony and&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove chrony&lt;br /&gt;
apt -y purge chrony&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and install it from scratch:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install chrony&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
cp ~/git/scripts/etc/triumf.sources /etc/chrony/sources.d/&lt;br /&gt;
systemctl disable systemd-timesyncd.service&lt;br /&gt;
systemctl stop systemd-timesyncd.service&lt;br /&gt;
systemctl disable ntp&lt;br /&gt;
systemctl stop ntp&lt;br /&gt;
systemctl enable chrony&lt;br /&gt;
systemctl restart chrony&lt;br /&gt;
chronyc sources&lt;br /&gt;
chronyc tracking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== reenable systemd-timesyncd ==&lt;br /&gt;
&lt;br /&gt;
ONLY IF CHRONY DOES NOT WORK&lt;br /&gt;
&lt;br /&gt;
To configure systemd-timesyncd, set &amp;quot;NTP=&amp;quot; in /etc/systemd/timesyncd.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chrony&lt;br /&gt;
cat /etc/systemd/timesyncd.conf&lt;br /&gt;
systemctl enable systemd-timesyncd.service&lt;br /&gt;
systemctl restart systemd-timesyncd.service&lt;br /&gt;
systemctl status systemd-timesyncd.service&lt;br /&gt;
timedatectl status&lt;br /&gt;
timedatectl timesync-status&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
this is different from ubuntu 20. it uses /etc/mailname and it hardwires the hostname into main.cf.&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email ==&lt;br /&gt;
&lt;br /&gt;
we have an unusual email configuration. outgoing email should work to deliver error messages, notices, etc. incoming email is disabled, we do not receive email for local users.&lt;br /&gt;
&lt;br /&gt;
this causes problems with TRIUMF smtp server. if our message cannot be delivered (wrong email address or receipient computer is turned off), TRIUMF smtp server will generate a delivery failure notification email and try to send it to the &amp;quot;from&amp;quot; address of the failed message. but the &amp;quot;from&amp;quot; address does not receive any email, so another delivery failure  notification email is generated and an attempt to deliver it. which again fails, rinse and repeat.&lt;br /&gt;
&lt;br /&gt;
as solution, kray created a special rule, email from scrap.triumf.ca does not generate delivery failure notices. failed messages sit in the queue for 5 days, then they are deleted. (K.O. - confirmed with kray 3jan2024).&lt;br /&gt;
&lt;br /&gt;
to make this work we use the msmtp MTA package.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install mailutils msmtp msmtp-mta # say &amp;quot;no&amp;quot; to apparmor support&lt;br /&gt;
apt -y remove postfix&lt;br /&gt;
apt -y purge postfix # remove old config files&lt;br /&gt;
apt -y install bsd-mailx&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -fv aliases /etc/aliases&lt;br /&gt;
/bin/cp -fv msmtprc /etc/msmtprc&lt;br /&gt;
/bin/rm -vf ~root/.forward&lt;br /&gt;
/bin/rm -vf /etc/mailname&lt;br /&gt;
Mail root&lt;br /&gt;
Subject: test&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
CC: &amp;lt;CR&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable outgoing email (postfix) ==&lt;br /&gt;
&lt;br /&gt;
THIS IS OBSOLETE!!!&lt;br /&gt;
&lt;br /&gt;
* TRIUMF: use smtp.triumf.ca&lt;br /&gt;
* CERN: use cernmx.cern.ch&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install postfix ### select &amp;quot;satellite system&amp;quot;, enter full hostname &amp;quot;xxx.triumf.ca&amp;quot;, enter &amp;quot;smtp.triumf.ca&amp;quot;&lt;br /&gt;
apt install mailutils&lt;br /&gt;
dpkg-reconfigure postfix ### (if postfix already installed)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo olchansk@triumf.ca lindner@triumf.ca bsmith@triumf.ca dfujimoto@triumf.ca &amp;gt;&amp;gt; ~root/.forward&lt;br /&gt;
mailx root&lt;br /&gt;
test&lt;br /&gt;
^D&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable ping for all users (debian 11) ==&lt;br /&gt;
&lt;br /&gt;
Without this tweak, Debian will report &amp;quot;operation not permitted&amp;quot; if a user tries to ping somewhere.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &#039;net.ipv4.ping_group_range = 0 1000&#039; &amp;gt; /etc/sysctl.d/99-ping.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable apparmor ==&lt;br /&gt;
&lt;br /&gt;
On NFS-Root network booted machines!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;man man&amp;quot; returns &amp;quot;permission denied&amp;quot; and syslog reports apparmor &amp;quot;sendmsg DENIED&amp;quot; errors, disable apparmor. This is supposedly fixed in kernel 6.0 and later (to be confirmed), see https://bugs.launchpad.net/ubuntu/+source/apparmor/+bug/1784499&lt;br /&gt;
&lt;br /&gt;
Disable apparmor, see https://ubuntu.com/server/docs/security-apparmor&lt;br /&gt;
&lt;br /&gt;
This takes effect after a reboot.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop apparmor.service&lt;br /&gt;
systemctl disable apparmor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If on boot apparmor appears to still be confining apps (for example, mysql), edit the file /etc/default/grub and change&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
to &lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;apparmor=0&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run sudo update-grub and reboot.&lt;br /&gt;
&lt;br /&gt;
== install missing packages ==&lt;br /&gt;
&lt;br /&gt;
(apt eats terminal input, even the &amp;quot;yes |&amp;quot; trick does not quite work,&lt;br /&gt;
repeat the following commands until they report that everything&lt;br /&gt;
is installed)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install ssh tcsh ethtool ncat rsync strace net-tools traceroute time minicom screen git lsof debsums tmux iptables telnet pax rpm mtools at gdisk tcpdump&lt;br /&gt;
yes | apt -y install sysstat smartmontools lm-sensors&lt;br /&gt;
yes | apt -y install lsb-release&lt;br /&gt;
apt -y install vim # in addition to default vim-tiny, requested by IRIS&lt;br /&gt;
apt -y install gedit # requested by TACTIC&lt;br /&gt;
apt -y install tcl&lt;br /&gt;
apt -y install mc # requested by sol&lt;br /&gt;
apt -y install pax rpm alien ### package converter tools&lt;br /&gt;
apt -y install flex bison&lt;br /&gt;
apt -y install neofetch&lt;br /&gt;
apt -y install snmp snmp-mibs-downloader&lt;br /&gt;
apt -y install git subversion g++ gfortran cmake doxygen&lt;br /&gt;
apt -y install curl libcurl4 libcurl4-openssl-dev&lt;br /&gt;
### conflits with mysql packages ### apt -y install mariadb-client libmariadb-dev ### mysql client for MIDAS&lt;br /&gt;
apt -y install mysql-client libmysqlclient-dev&lt;br /&gt;
apt -y install postgresql-common libpq-dev ### postgresql client for MIDAS&lt;br /&gt;
yes | apt -y install libz-dev libzstd-dev sqlite3 libsqlite3-dev unixodbc-dev&lt;br /&gt;
yes | apt -y install libssl-dev&lt;br /&gt;
yes | apt -y install emacs xemacs21 joe&lt;br /&gt;
yes | apt -y install gnuplot dos2unix&lt;br /&gt;
yes | apt -y install mutt bsd-mailx # email clients&lt;br /&gt;
yes | apt -y install liblz4-tool pbzip2 libbz2-dev&lt;br /&gt;
yes | apt -y install libc6-dev-i386 # otherwise no /usr/include/sys/types.h&lt;br /&gt;
yes | apt -y install libreadline-dev&lt;br /&gt;
yes | apt -y install ubuntu-mate-themes&lt;br /&gt;
yes | apt -y install libmotif-dev libxmu-dev&lt;br /&gt;
yes | apt -y install libusb-dev libusb-1.0-0-dev&lt;br /&gt;
yes | apt -y install i2c-tools libi2c-dev libi2c0&lt;br /&gt;
yes | apt -y install xfig gsfonts-x11 gsfonts-other # install fonts for xfig&lt;br /&gt;
yes | apt -y install libjson-perl&lt;br /&gt;
yes | apt -y install libgsl-dev # additional GNU Scientific Library&lt;br /&gt;
yes | apt -y install qt5-default # Qt development&lt;br /&gt;
yes | apt -y install python3-full python3-dev python3-dbg python3-pip ### for pyROOT&lt;br /&gt;
yes | apt -y install imagemagick imagemagick-common ckeditor # for elog&lt;br /&gt;
yes | apt -y install libjpeg-dev libjpeg-progs libjpeg-tools&lt;br /&gt;
yes | apt -y install linux-tools-common linux-tools-generic # cpupower frequency-info&lt;br /&gt;
yes | apt -y install rdesktop remmina remmina-plugin&amp;quot;*&amp;quot; # requested by POL&lt;br /&gt;
yes | apt -y install nlohmann-json3-dev # required to build MIDAS with ROOT 6.30 on Ubuntu-22&lt;br /&gt;
apt -y install dpkg-dev cmake g++ gcc binutils libx11-dev libxpm-dev libxft-dev libxext-dev python3 libssl-dev libafterimage0 # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install gfortran libpcre3-dev xlibmesa-glu-dev libglew-dev libftgl-dev libmysqlclient-dev libfftw3-dev libcfitsio-dev graphviz-dev libldap2-dev python3-dev python3-numpy libxml2-dev libkrb5-dev libgsl0-dev qtwebengine5-dev nlohmann-json3-dev libtbb-dev libavahi-compat-libdnssd-dev # from https://root.cern/install/dependencies/&lt;br /&gt;
apt -y install libvdt-dev # for ROOT 6.32 on Ubuntu-24&lt;br /&gt;
apt -y install autoconf automake gperf # gnu package build tools&lt;br /&gt;
apt -y install u-boot-tools # for Xilinx petalinux&lt;br /&gt;
#apt -y install linux-headers-generic # to build linux kernel drivers&lt;br /&gt;
apt -y install vim htop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 20.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 # enable linux 5.11 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 22.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-22.04 # enable linux 6.8.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24.04:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install linux-generic-hwe-24.04 # enable linux 6.14.0 series kernel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== remove snap ==&lt;br /&gt;
&lt;br /&gt;
remove snap at this point.&lt;br /&gt;
&lt;br /&gt;
== install non-snap firefox ==&lt;br /&gt;
&lt;br /&gt;
delay this until the very end, download of firefox-esr deb package is very slow.&lt;br /&gt;
&lt;br /&gt;
See https://askubuntu.com/questions/1399383/how-to-install-firefox-as-a-traditional-deb-package-without-snap-in-ubuntu-22&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add-apt-repository ppa:mozillateam/ppa&lt;br /&gt;
apt install firefox-esr&lt;br /&gt;
echo run firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Enable automatic updates:&lt;br /&gt;
&lt;br /&gt;
* rerun [[#Enable_automatic_updates]]&lt;br /&gt;
&lt;br /&gt;
== configure DNS ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /etc/systemd/resolved.conf.d&lt;br /&gt;
cp etc/resolved-triumf.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
systemctl restart systemd-resolved&lt;br /&gt;
resolvectl&lt;br /&gt;
#systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install ganglia-monitor&lt;br /&gt;
cd ~root/git/scripts/ganglia&lt;br /&gt;
git pull&lt;br /&gt;
make install&lt;br /&gt;
./ganglia-all.perl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
fix gmond start before network is ready:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/ganglia-monitor.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/ganglia-monitor.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat ganglia-monitor.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ganglia server ==&lt;br /&gt;
&lt;br /&gt;
on the main computer (daq00, dsdaqgw, etc)&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/ganglia&lt;br /&gt;
* apt install gmetad php php-xml rrdtool&lt;br /&gt;
* mv /etc/ganglia/gmetad.conf /etc/ganglia/gmetad.conf-stock&lt;br /&gt;
* create /etc/ganglia/gmetad.conf with the following contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
data_source &amp;quot;my cluster&amp;quot; 15 localhost&lt;br /&gt;
RRAs &amp;quot;RRA:AVERAGE:0.5:1:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:24:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:168:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:672:244&amp;quot; &amp;quot;RRA:AVERAGE:0.5:5760:374&amp;quot;&lt;br /&gt;
setuid_username &amp;quot;ganglia&amp;quot;&lt;br /&gt;
rrd_rootdir &amp;quot;/ganglia/rrds&amp;quot;&lt;br /&gt;
case_sensitive_hostnames 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir /ganglia/rrds&lt;br /&gt;
* chown ganglia:ganglia /ganglia/rrds&lt;br /&gt;
* systemctl restart gmetad&lt;br /&gt;
* create /etc/ganglia/gmond-collect.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
globals {&lt;br /&gt;
  daemonize = yes&lt;br /&gt;
  setuid = yes&lt;br /&gt;
  user = nobody&lt;br /&gt;
  debug_level = 0&lt;br /&gt;
  max_udp_msg_len = 1472&lt;br /&gt;
  mute = no&lt;br /&gt;
  #deaf = yes&lt;br /&gt;
  deaf = no&lt;br /&gt;
  allow_extra_data = yes&lt;br /&gt;
  host_dmax = 0 /* 86400 */ /*secs. Expires (removes from web interface) hosts in 1 day */&lt;br /&gt;
  host_tmax = 20 /*secs */&lt;br /&gt;
  cleanup_threshold = 300 /*secs */&lt;br /&gt;
  gexec = no&lt;br /&gt;
  send_metadata_interval = 600 /*secs */&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/*&lt;br /&gt;
 * The cluster attributes specified will be used as part of the &amp;lt;CLUSTER&amp;gt;&lt;br /&gt;
 * tag that will wrap all hosts collected by this instance.&lt;br /&gt;
 */&lt;br /&gt;
cluster {&lt;br /&gt;
  name = &amp;quot;DAQ&amp;quot;&lt;br /&gt;
  owner = &amp;quot;TRIUMF DAQ&amp;quot;&lt;br /&gt;
  latlong = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
  url = &amp;quot;https://daq.triumf.ca&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* The host section describes attributes of the host, like the location */&lt;br /&gt;
host {&lt;br /&gt;
  location = &amp;quot;unspecified&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_send_channel {&lt;br /&gt;
  host = daq00.triumf.ca&lt;br /&gt;
  bind_hostname = yes&lt;br /&gt;
  port = 8649&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71&lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71&lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really&lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.&lt;br /&gt;
  #buffer = 10485760&lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv4&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # vlan1 daq00&lt;br /&gt;
      ip = 142.90.111.168&lt;br /&gt;
      mask = 19&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # MUSR VLAN&lt;br /&gt;
      ip = 142.90.154.73&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    access {&lt;br /&gt;
      # KVM network&lt;br /&gt;
      ip = 192.168.1.1&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
udp_recv_channel {&lt;br /&gt;
  #mcast_join = 239.2.11.71                                                                                                                                                                                                &lt;br /&gt;
  port = 8649&lt;br /&gt;
  #bind = 239.2.11.71                                                                                                                                                                                                      &lt;br /&gt;
  retry_bind = true&lt;br /&gt;
  # Size of the UDP buffer. If you are handling lots of metrics you really                                                                                                                                                 &lt;br /&gt;
  # should bump it up to e.g. 10MB or even higher.                                                                                                                                                                         &lt;br /&gt;
  #buffer = 10485760                                                                                                                                                                                                       &lt;br /&gt;
  buffer = 200000&lt;br /&gt;
  family = ipv6&lt;br /&gt;
&lt;br /&gt;
  acl {&lt;br /&gt;
    default = &amp;quot;deny&amp;quot;&lt;br /&gt;
    access {&lt;br /&gt;
      # ALPHA network                                                                                                                                                                                                      &lt;br /&gt;
      ip = 2001:1458:202:fd::100:aa&lt;br /&gt;
      mask = 8&lt;br /&gt;
      action = &amp;quot;allow&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    #access {                                                                                                                                                                                                              &lt;br /&gt;
    #  # ALPHA-g network                                                                                                                                                                                                   &lt;br /&gt;
    #  ip = 192.168.1.1                                                                                                                                                                                                    &lt;br /&gt;
    #  mask = 8                                                                                                                                                                                                            &lt;br /&gt;
    #  action = &amp;quot;allow&amp;quot;                                                                                                                                                                                                    &lt;br /&gt;
    #}                                                                                                                                                                                                                     &lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
tcp_accept_channel {&lt;br /&gt;
  port = 8649&lt;br /&gt;
  bind = localhost&lt;br /&gt;
  # If you want to gzip XML output&lt;br /&gt;
  gzip_output = no&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add to /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/usr/sbin/gmond -c /etc/ganglia/gmond-collect.conf &amp;amp;&lt;br /&gt;
systemctl restart gmetad &amp;amp;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /ganglia&lt;br /&gt;
* git clone https://daq00.triumf.ca/~olchansk/git/ganglia-web.git&lt;br /&gt;
* cd ganglia-web&lt;br /&gt;
* git checkout KO1&lt;br /&gt;
* ln -s /ganglia/ganglia-web /var/www/html/ganglia&lt;br /&gt;
* make dwoo directories&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /var/lib/ganglia-web&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/compiled&lt;br /&gt;
mkdir /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
chown www-data:www-data /var/lib/ganglia-web/dwoo/cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://alphacpc05.cern.ch/ganglia/&lt;br /&gt;
&lt;br /&gt;
== install gonodeinfo ==&lt;br /&gt;
&lt;br /&gt;
* go to https://bitbucket.org/dd1/gonodeinfo follow instructions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install golang&lt;br /&gt;
mkdir ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
#git clone https://bitbucket.org/dd1/gonodeinfo.git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
cd gonodeinfo&lt;br /&gt;
git remote set-url origin https://daq00.triumf.ca/~olchansk/git/gonodeinfo.git&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install # install gonodeinfo agent&lt;br /&gt;
cd ~ # this is important&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/gonodeinfo.conf&lt;br /&gt;
* change &amp;quot;Description&amp;quot;, &amp;quot;Location&amp;quot;, &amp;quot;User&amp;quot; and &amp;quot;Administrator&amp;quot; as appropriate (or delete them)&lt;br /&gt;
* change &amp;quot;Servers&amp;quot; to read: Servers: daq00.triumf.ca:8601&lt;br /&gt;
* run &amp;quot;gonodeinfo -v&amp;quot;&lt;br /&gt;
* if error is &amp;quot;connection refused&amp;quot;. go to the nodeinfo server to add this client to the access control list:&lt;br /&gt;
* on the gonodeinfo server: run /opt/gonodeinfo/gonodereceive.exe -a daq13&lt;br /&gt;
* try gonodeinfo again, there should be no error&lt;br /&gt;
* on the gonodeinfo server: run gonodereport, look at the web pages, the new machine should be listed now&lt;br /&gt;
&lt;br /&gt;
== install emailonreboot ==&lt;br /&gt;
&lt;br /&gt;
send an email if computer is rebooted&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/emailonreboot&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install monitor_nfs ==&lt;br /&gt;
&lt;br /&gt;
monitor NFS mounts and complain about dead, stale and hung mounts&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh root&lt;br /&gt;
mkdir -p ~/git&lt;br /&gt;
cd ~/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/rpms.git&lt;br /&gt;
cd rpms/monitor_nfs&lt;br /&gt;
git pull&lt;br /&gt;
make&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install fonts for EPICS ==&lt;br /&gt;
&lt;br /&gt;
* apt -y install xfonts-100dpi xfonts-75dpi&lt;br /&gt;
* restart Xorg (i.e. &amp;quot;killall Xorg&amp;quot;, this will log you out from the console)&lt;br /&gt;
* xlsfonts | grep -i helvetica ### should show fonts with different sizes, not just size 0 (scalable)&lt;br /&gt;
&lt;br /&gt;
== install libz.so.1 for CentOS compatibility ==&lt;br /&gt;
&lt;br /&gt;
KO - confirm which versions on quartus need this.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yes | apt-get -y install zlib1g&lt;br /&gt;
yes | apt-get -y install zlib1g:i386 libc6:i386 libgcc1:i386 gcc-6-base:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ld-ldb-x86-64.so.3 for Quartus compatibility ==&lt;br /&gt;
&lt;br /&gt;
Not clear from package this is supposed to come from. Copied from U-20.&lt;br /&gt;
&lt;br /&gt;
Without this, Quartus lmgrd does not run.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /lib64&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2&lt;br /&gt;
ln -s  ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
should look like this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:/lib64# ls -l&lt;br /&gt;
total 3&lt;br /&gt;
lrwxrwxrwx 1 root root 44 Jan 28 09:07 ld-linux-x86-64.so.2 -&amp;gt; ../lib/x86_64-linux-gnu/ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.2 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
lrwxrwxrwx 1 root root 20 Feb 18 16:45 ld-lsb-x86-64.so.3 -&amp;gt; ld-linux-x86-64.so.2&lt;br /&gt;
root@daq13:/lib64# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install libpng12.so.0 for Quartus 13.0sp1 and 13.1.4.182 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/libpng12.so.0.50.0&lt;br /&gt;
/bin/cp -pv libpng12.so.0 libpng12.so.0.50.0 /lib/x86_64-linux-gnu/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for Xilinx ==&lt;br /&gt;
&lt;br /&gt;
ubuntu LTS 22.04 vivado 2020.1&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install autoconf libtool&lt;br /&gt;
apt install libtinfo5&lt;br /&gt;
apt install texinfo&lt;br /&gt;
apt install zlib1g:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install packages for building ROOT ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install libx11-dev libxpm-dev libxft-dev libxext-dev libpng-dev libjpeg-dev xlibmesa-glu-dev libxml2-dev libgsl-dev cmake&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install wine ==&lt;br /&gt;
&lt;br /&gt;
As far as I know, only needed for BNMR/BNQR&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install wine winetricks&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install lightdm ==&lt;br /&gt;
&lt;br /&gt;
unlike the default gdm login manager, lightdm shows the machine hostname and does not require an extra mouse click to swicth from screen saver to login mode.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install lightdm&lt;br /&gt;
# select lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install desktop environments ==&lt;br /&gt;
&lt;br /&gt;
note: default display manager and default desktop are deficient, please do not skip this step.&lt;br /&gt;
&lt;br /&gt;
note: if apt asks to choose the display manager, select &amp;quot;lightdm&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note: KO - I recommend the &amp;quot;MATE&amp;quot; desktop.&lt;br /&gt;
&lt;br /&gt;
note: you will have to cut-and-paste this several times because &amp;quot;apt&amp;quot; eats commands, even with &amp;quot;-y&amp;quot; and even piped from &amp;quot;yes&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# install MATE desktop&lt;br /&gt;
apt -y install ubuntu-mate-core ubuntu-mate-desktop ubuntu-mate-themes&lt;br /&gt;
# install Cinnamon desktop&lt;br /&gt;
apt -y install cinnamon&lt;br /&gt;
# install KDE desktop&lt;br /&gt;
apt -y install kde-standard kubuntu-settings-desktop&lt;br /&gt;
# install Lxqt desktop&lt;br /&gt;
# apt -y install lxqt # conflict over kubuntu-desktop, kubuntu-settings-desktop and desktop-base&lt;br /&gt;
# install Xfce4 desktop&lt;br /&gt;
apt -y install xfce4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install ROOT ==&lt;br /&gt;
&lt;br /&gt;
Please install ROOT per instructions at https://root.cern.ch.&lt;br /&gt;
&lt;br /&gt;
NOTE1: The ROOT package available from Ubuntu repositories is severely out of date and cannot be used with MIDAS and ROOTANA. ### DO NOT DO THIS! apt-get install root-system&lt;br /&gt;
&lt;br /&gt;
NOTE2: as of 2017-Jan-09, ROOT binary kits for Ubuntu do not work (use GCC 5 instead of GCC6), build from source instead.&lt;br /&gt;
&lt;br /&gt;
== Install x2go ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get update&lt;br /&gt;
apt-get install x2goserver x2goserver-xsession&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable root login from ladd00/daq00 ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ssh localhost&lt;br /&gt;
CTRL-C&lt;br /&gt;
/bin/cp ~root/git/scripts/etc/authorized_keys ~root/.ssh/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== disable ssh access from outside of TRIUMF ==&lt;br /&gt;
&lt;br /&gt;
to stop ssh login spam, disable ssh access from outside of TRIUMF. this can be done by requesting a firewall block through the helpdesk or by local firewall rule:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo iptables -I INPUT ! -s 142.90.0.0/255.255.0.0 -p tcp --dport 22 -j REJECT &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
/etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== install smart-status ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s ~/git/scripts/smart-status/smart-status.perl ~root/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== enable boot menu and boot messages ==&lt;br /&gt;
&lt;br /&gt;
This will enable the grub menu (with a 10 sec timeout) and&lt;br /&gt;
replace black screen with exciting linux boot messages.&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/default/grub&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GRUB_DEFAULT=0&lt;br /&gt;
GRUB_TIMEOUT_STYLE=menu&lt;br /&gt;
GRUB_TIMEOUT=10&lt;br /&gt;
GRUB_RECORDFAIL_TIMEOUT=10&lt;br /&gt;
GRUB_DISTRIBUTOR=`lsb_release -i -s 2&amp;gt; /dev/null || echo Debian`&lt;br /&gt;
#GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;vga=769 video=640x480&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;&amp;quot;&lt;br /&gt;
GRUB_CMDLINE_LINUX=&amp;quot;&amp;quot;&lt;br /&gt;
#GRUB_GFXMODE=640x480&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update grub config:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable automatic updates =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install unattended-upgrades&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/99apt-conf-ko /etc/apt/apt.conf.d/&lt;br /&gt;
apt-config dump | grep Unattended&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Following is obsolete:&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/50unattended-upgrades&lt;br /&gt;
** uncomment in Allowed-Origins &amp;quot;-security&amp;quot; and &amp;quot;-updates&amp;quot;&lt;br /&gt;
** add in Allowed-Origins: &amp;quot;Google LLC:stable&amp;quot;;&lt;br /&gt;
** uncomment/add: &amp;quot;Unattended-Upgrade::Mail &amp;quot;root&amp;quot;;&lt;br /&gt;
* emacs -nw /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;1&amp;quot;;&lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;7&amp;quot;;&lt;br /&gt;
APT::Periodic::Unattended-Upgrade &amp;quot;1&amp;quot;;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* test: unattended-upgrade --dry-run -v&lt;br /&gt;
&lt;br /&gt;
NOTE: update-on-shutdown is disabled.&lt;br /&gt;
&lt;br /&gt;
NOTE: there is no update-on-boot, but:&lt;br /&gt;
&lt;br /&gt;
NOTE: if machine was off for a long time, the systemd update timer would have expired and it will fire soon after reboot, causing an automatic update run. this is unwanted, and there is no fix or workaround for it. K.O. June-2023.&lt;br /&gt;
&lt;br /&gt;
= Fix bpool is full (obsolete) =&lt;br /&gt;
&lt;br /&gt;
THIS IS CAUSED BY OBSOLETE PACKAGE zsys. PLEASE: apt remove zsys&lt;br /&gt;
&lt;br /&gt;
= IPMI instructions =&lt;br /&gt;
&lt;br /&gt;
IPMI is the board management hardware on Supermicro and other server motherboards. This includes hardware sensors - fan rotation speed, temperatures and power supply voltages.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt-get install ipmitool&lt;br /&gt;
systemctl enable ipmievd&lt;br /&gt;
systemctl restart ipmievd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run:&lt;br /&gt;
* ipmitool sel list ### event list&lt;br /&gt;
* ipmitool sel elist ### event list&lt;br /&gt;
* ipmitool sel clear ### clear event list (if it becomes full)&lt;br /&gt;
* ipmitool sensor ### report hardware sensors&lt;br /&gt;
&lt;br /&gt;
= move /home/wheel (U-24) =&lt;br /&gt;
&lt;br /&gt;
Ubuntu LTS 24 installed on ZFS has rpool/USERDATA/home_xxx mounted on /home,&lt;br /&gt;
has to be moved or autofs /home will not work.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
zfs set -u mountpoint=/home1 `zfs list | grep USERDATA | grep home | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
emacs -nw /etc/passwd # change mount for wheel account to /home1/wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will not take effect until rebooting.  Please ensure that ssh from root@daq00 to this computer works before rebooting; if ssh from root@daq00 doesn&#039;t work and you mess this up you will be locked out of wheel account. Once you verify that this works, reboot and make sure that when you login as wheel that home directory is /home1/wheel.  &lt;br /&gt;
&lt;br /&gt;
= move /home/wheel =&lt;br /&gt;
&lt;br /&gt;
note: this MUST be done if ZFS root and NIS/autofs with /home.&lt;br /&gt;
&lt;br /&gt;
Default location of wheel&#039;s home directory will collide with autofs /home, it has to be moved,&lt;br /&gt;
for example to /wheel.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# logout from the wheel user&lt;br /&gt;
# go to another computer&lt;br /&gt;
ssh root@daqubuntuxxx&lt;br /&gt;
zfs list | grep wheel ### identify zfs name wheel_xxxxxx&lt;br /&gt;
#zfs set mountpoint=/wheel rpool/USERDATA/wheel_hm8fzh&lt;br /&gt;
zfs set mountpoint=/wheel `zfs list | grep wheel | cut -f1 -d&amp;quot; &amp;quot;`&lt;br /&gt;
zfs list | grep wheel&lt;br /&gt;
emacs -nw /etc/passwd ### change wheel&#039;s home directory from /home/wheel to /wheel&lt;br /&gt;
su - wheel ### check that user wheel still works&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will break wheel&#039;s ability to run snap programs, such as firefox, install chrome as listed below.&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 22.04, 24.04, debian 11, 12) =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install rpcbind nis&lt;br /&gt;
echo DAQ-NIS &amp;gt;&amp;gt; /etc/defaultdomain&lt;br /&gt;
echo ypserver daq00.triumf.ca &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
systemctl enable ypbind.service&lt;br /&gt;
systemctl restart ypbind.service&lt;br /&gt;
systemctl status ypbind.service&lt;br /&gt;
ypwhich -m&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
enable ypserv:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sed -i s/NISSERVER=false/NISSERVER=slave/ /etc/default/nis&lt;br /&gt;
/usr/lib/yp/ypinit -s daq00&lt;br /&gt;
echo ypserver localhost &amp;gt;&amp;gt; /etc/yp.conf&lt;br /&gt;
sed -i &amp;quot;s/ypserver .*/ypserver localhost/&amp;quot; /etc/yp.conf&lt;br /&gt;
systemctl enable ypserv&lt;br /&gt;
systemctl restart ypserv&lt;br /&gt;
systemctl restart ypbind&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
update /etc/nsswitch.conf and enable hourly update of NIS maps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp -pv nsswitch.conf-U24 /etc/nsswitch.conf&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If this is a new machine, then on the master NIS node (daq00), add this new node to /etc/netgroup, and update NIS maps (cd /var/yp; make)&lt;br /&gt;
&lt;br /&gt;
= enable NIS (ubuntu 20.04) =&lt;br /&gt;
&lt;br /&gt;
* apt-get -y install portmap nis ### will ask for NIS domain (DAQ-NIS)&lt;br /&gt;
* dpkg-reconfigure nis ### reconfigure if already installed&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* edit /etc/default/nis&lt;br /&gt;
** set &amp;quot;NISSERVER=slave&amp;quot;&lt;br /&gt;
** Ubuntu LTS 20.04, check that &amp;quot;YPBINDARGS=&amp;quot; is blank, remove &amp;quot;-no-dbus&amp;quot; if it is there&lt;br /&gt;
* #edit /etc/yp.conf, comment-out everything, add &amp;quot;domain DAQ-NIS server localhost&amp;quot;&lt;br /&gt;
* edit /etc/yp.conf, comment-out everything, add &amp;quot;ypserver localhost&amp;quot;&lt;br /&gt;
* /usr/lib/yp/ypinit -s daq00&lt;br /&gt;
* systemctl enable nis&lt;br /&gt;
* systemctl restart nis&lt;br /&gt;
* ypwhich&lt;br /&gt;
* ypwhich -m&lt;br /&gt;
* ypcat -k passwd&lt;br /&gt;
* vi /etc/nsswitch.conf ### add the automount line, modify the passwd, group and shadow lines to read this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# begin get data from nis&lt;br /&gt;
passwd: files nis&lt;br /&gt;
group: files nis&lt;br /&gt;
shadow: files nis&lt;br /&gt;
automount:  files nis&lt;br /&gt;
netgroup: files nis&lt;br /&gt;
# end get data from nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable hourly update of NIS maps&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir ~root/git&lt;br /&gt;
cd ~root/git&lt;br /&gt;
git clone https://daq00.triumf.ca/~olchansk/git/scripts.git&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
ln -s $PWD/ypxfr-cron-hourly /etc/cron.hourly&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ### NOT NEEDED sudo vi /etc/idmapd.conf ### add line: &amp;quot;Domain = triumf.ca&amp;quot;&lt;br /&gt;
&lt;br /&gt;
= enable autofs =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install autofs&lt;br /&gt;
systemctl enable autofs&lt;br /&gt;
systemctl restart autofs&lt;br /&gt;
ls -l /home/olchansk ### test autofs, check file owner is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= enable NFS server =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install nfs-kernel-server&lt;br /&gt;
#edit /etc/exports&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= NIS master =&lt;br /&gt;
&lt;br /&gt;
notes for setting up the NIS master&lt;br /&gt;
&lt;br /&gt;
== wheel user ==&lt;br /&gt;
&lt;br /&gt;
&amp;quot;wheel&amp;quot; is the default administrative user. We do not want it&#039;s password exported to NIS (encrypted password hash is world visible) and we do not want it&#039;s home directory exported to NFS (~wheel/.ssh is world visible and potentially writable: anybody can change ~wheel/.ssh/authorized_keys).&lt;br /&gt;
&lt;br /&gt;
* move wheel&#039;s home directory from /home/wheel to /wheel (see special section about this)&lt;br /&gt;
* change wheel&#039;s UID and GID from 1000 to a value below MINUID in /var/yp/Makefile&lt;br /&gt;
&lt;br /&gt;
== coherent uids ==&lt;br /&gt;
&lt;br /&gt;
we do not want system accounts defined in /etc/passwd of the NIS master&lt;br /&gt;
to be included in the NIS map &amp;quot;passwd&amp;quot;. this causes trouble on NIS clients&lt;br /&gt;
where newly installed packages fail to create local system users because same&lt;br /&gt;
user already exists in NIS.&lt;br /&gt;
&lt;br /&gt;
This is controlled by MINUID in /var/yp/Makefile.&lt;br /&gt;
&lt;br /&gt;
Historical TRIUMF uids start from around 200, but several clusters do not have any historic TRIUMF uids below 500 and MINUID is set to:&lt;br /&gt;
* DAQ-NIS: MINUID=200&lt;br /&gt;
* ISAC-NIS: MINUID=500&lt;br /&gt;
* TITAN-NIS: MINUID=500&lt;br /&gt;
* MUSR-NIS: MINUID=500&lt;br /&gt;
* TIG-NIS: MINUID=500 (100 on SL6 mother8pi)&lt;br /&gt;
&lt;br /&gt;
Ubuntu 20 has two programs to create users:&lt;br /&gt;
* adduser - creates new users with UID 1000 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* adduser --system - creates new system users with UID 100 and up as specified in /etc/adduser.conf. No problems here.&lt;br /&gt;
* useradd - creates new users with UID 1000 and up as specified in /etc/login.defs. No problems here.&lt;br /&gt;
* useradd --system - creates new system users with UID 999 and down (read &amp;quot;man useradd&amp;quot;, section at the end about SYS_UID_MAX). This collides with NIS MINUID, these system users will be included in the NIS map and cause trouble.&lt;br /&gt;
&lt;br /&gt;
This problem cannot be fixed, SYS_UID_MIN, SYS_UID_MAX and UID_MIN in /etc/login.defs do not seem&lt;br /&gt;
to have any effect on UIDs chosen by &amp;quot;useradd --system&amp;quot;. (tested on Ubuntu LTS 20.04).&lt;br /&gt;
&lt;br /&gt;
So far only these system accounts seem to be affected by this:&lt;br /&gt;
* systemd-coredump&lt;br /&gt;
* ganglia&lt;br /&gt;
&lt;br /&gt;
To fix:&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/passwd&amp;quot; to identify the last unused system user uid (range 100..200)&lt;br /&gt;
* run &amp;quot;sort -r -n -t: -k3 /etc/group&amp;quot; to identify the last unused system user gid (range 100.200)&lt;br /&gt;
* systemd-coredump: manually change UID and GID (package systemd-coredump is usually not installed)&lt;br /&gt;
* ganglia: same thing, then change ownership on all ganglia files.&lt;br /&gt;
&lt;br /&gt;
Also read systemd author&#039;s opinion on system vs user UIDs:&lt;br /&gt;
https://github.com/systemd/systemd/issues/4850#issuecomment-265698275&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-logind NIS breakage =&lt;br /&gt;
&lt;br /&gt;
!!! THIS IS NOT NEEDED FOR UBUNTU LTS 20.04 !!!&lt;br /&gt;
&lt;br /&gt;
there is a delay in ssh logins for normal users. &amp;quot;ssh -v&amp;quot; shows the delay is after &amp;quot;pledge...&amp;quot;. this&lt;br /&gt;
fix removes the delay.&lt;br /&gt;
&lt;br /&gt;
systemd developers think that we should not use NIS and made sure there are&lt;br /&gt;
problems if we do. To give them credit, they do offer a workaround. Read this:&lt;br /&gt;
https://github.com/poettering/systemd/commit/695fe4078f0df6564a1be1c4a6a9e8a640d23b67&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-logind.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-logind.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-logind.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Fix systemd-udevd NIS breakage =&lt;br /&gt;
&lt;br /&gt;
see same problem as above with udev getting stuck. ubuntu lts 20.04.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/systemd-udevd.service.d&lt;br /&gt;
echo -e &amp;quot;[Service]\nIPAddressDeny=\n&amp;quot; &amp;gt; /etc/systemd/system/systemd-udevd.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat systemd-udevd.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure USB device permissions =&lt;br /&gt;
&lt;br /&gt;
Configure USB device permissions for user access to USB-serial devices, Altera USB Blaster, etc.&lt;br /&gt;
&lt;br /&gt;
* create file /etc/udev/rules.d/99-usb-chmod.rules with this contents:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
emacs -nw /etc/udev/rules.d/99-usb-chmod.rules&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usbmisc&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot; &lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /dev/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr /proc/%c&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVTYPE}==&amp;quot;usb_device&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVICE}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{PHYSDEVBUS}==&amp;quot;usb-serial&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, ENV{DEVPATH}==&amp;quot;/class/tty/ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+wr $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyUSB*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyACM*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, SUBSYSTEM==&amp;quot;tty&amp;quot;, DEVPATH==&amp;quot;*ttyS*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
ACTION==&amp;quot;add&amp;quot;, DEVPATH==&amp;quot;*video*&amp;quot;, RUN+=&amp;quot;/bin/chmod a+rw $env{DEVNAME}&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* reload udev rules: udevadm control --reload-rules&lt;br /&gt;
* apply new permissions: udevadm trigger --action=add&lt;br /&gt;
* watch udev activity: udevadm monitor -p&lt;br /&gt;
&lt;br /&gt;
= Configure lightdm display manager =&lt;br /&gt;
&lt;br /&gt;
* enable it&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo lightdm | dpkg-reconfigure -fteletype lightdm&lt;br /&gt;
systemctl disable gdm&lt;br /&gt;
systemctl disable sddm&lt;br /&gt;
systemctl enable lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* make the MATE desktop as default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~root/git/scripts/&lt;br /&gt;
git pull&lt;br /&gt;
/bin/cp -v etc/lightdm_default_mate.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* enable login by NIS users&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/cp -v etc/lightdm_enable_nis_login.conf /etc/lightdm/lightdm.conf.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart lightdm&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop gdm&lt;br /&gt;
systemctl restart lightdm&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install libpng12.so.0 =&lt;br /&gt;
&lt;br /&gt;
Quartus 16 needs libpng12:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
dpkg --install libpng12-0_1.2.54-1ubuntu1_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install google-chrome =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb&lt;br /&gt;
dpkg -i google-chrome-stable_current_amd64.deb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
confirm autoupdate is enabled, observe dl.google.com is present in the list of repositories:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
...&lt;br /&gt;
Get:5 https://dl.google.com/linux/chrome/deb stable/main amd64 Packages [1,094 B]&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
FOLLOWING IS OBSOLETE:&lt;br /&gt;
&lt;br /&gt;
Instructions from here:&lt;br /&gt;
https://www.ubuntuupdates.org/ppa/google_chrome?dist=stable&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -&lt;br /&gt;
sh -c &#039;echo &amp;quot;deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main&amp;quot; &amp;gt;&amp;gt; /etc/apt/sources.list.d/google-tmp.list&#039;&lt;br /&gt;
apt update&lt;br /&gt;
apt install google-chrome-stable&lt;br /&gt;
/bin/rm -f /etc/apt/sources.list.d/google-tmp.list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install amanda client =&lt;br /&gt;
&lt;br /&gt;
ONLY ON MACHINES THAT HOST HOME DIRECTORIES&lt;br /&gt;
&lt;br /&gt;
* apt install amanda-client&lt;br /&gt;
* edit /etc/amandahosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
amanda.triumf.ca amanda amdump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check permissions on /etc/amandahosts:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:/var/log/amanda# ls -l /etc/amandahosts&lt;br /&gt;
-rw------- 1 backup backup 49 Jan 27 10:48 /etc/amandahosts&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix if needed: chown backup.backup /etc/amandahosts; chmod a= /etc/amandahosts; chmod u=wr /etc/amandahosts&lt;br /&gt;
* edit /etc/amanda-security.conf, add this line:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
runtar:gnutar_path=/usr/bin/tar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On the amanda machine:&lt;br /&gt;
&lt;br /&gt;
* in amanda disklist, use dump type &amp;quot;bsdtcp-comp-user-tar&amp;quot;&lt;br /&gt;
* su - amanda and run amcheck -c daily daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-bash-4.1$ amcheck -c daily daq00&lt;br /&gt;
&lt;br /&gt;
Amanda Backup Client Hosts Check&lt;br /&gt;
--------------------------------&lt;br /&gt;
Client check: 1 host checked in 0.092 seconds.  0 problems found.&lt;br /&gt;
&lt;br /&gt;
(brought to you by Amanda 3.3.7p1.git.685ff76d)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable rc.local =&lt;br /&gt;
&lt;br /&gt;
For reasons unknown, Ubuntu LTS 20.04 does not enable /etc/rc.local. Do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cp -n -v etc/rc.local /etc/&lt;br /&gt;
chmod a+rx /etc/rc.local&lt;br /&gt;
cp etc/rc-local.service /etc/systemd/system/&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl enable rc-local&lt;br /&gt;
systemctl start rc-local&lt;br /&gt;
systemctl status rc-local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Remove unwanted packages =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge  bash-completion # broken, adds unwanted &amp;quot;\&amp;quot; if &amp;quot;ls -l $ROOTSYS/&amp;lt;tab&amp;gt;&amp;quot;&lt;br /&gt;
apt purge  zsys # broken, do not use&lt;br /&gt;
apt purge  sddm # login manager&lt;br /&gt;
apt purge  avahi-daemon avahi-autoipd # not sure what it does, observed using 100% CPU&lt;br /&gt;
apt purge  modemmanager # probes all serial ports to see if it&#039;s a modem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable unwanted services =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable mpd&lt;br /&gt;
systemctl disable snapd&lt;br /&gt;
systemctl disable ModemManager&lt;br /&gt;
systemctl --global mask tracker-extract-3.service&lt;br /&gt;
systemctl --global mask tracker-miner-fs-3.service&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable sleep and suspend =&lt;br /&gt;
&lt;br /&gt;
note: we see some computers randomly shutdown or go to sleep, log files indicates the &amp;quot;sleep&amp;quot; or &amp;quot;suspend&amp;quot; button was pushed by user, but no such buttons actually exist. this is the fix for this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target systemd-suspend.service systemd-hybrid-sleep.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable crontab @reboot for MIDAS =&lt;br /&gt;
&lt;br /&gt;
startup scripts have a bug - cron @reboot entries for normal users can run before autofs is ready, so if the home directory is on autofs/NFS, it cannot be accessed and the cron job fails. If MIDAS is supposed to be started by cron @reboot, it will not start (there *will* be an error message in /var/log/cron).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/cron.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=ypbind.service autofs.service\n&amp;quot; &amp;gt; /etc/systemd/system/cron.service.d/local.conf&lt;br /&gt;
systemctl daemon-reload&lt;br /&gt;
systemctl cat cron.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Explore the systemd dependency tree using &amp;quot;systemctl list-dependencies&amp;quot; maybe with &amp;quot;--all&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Visualize the exact boot sequence from previous boot: &amp;quot;systemd-analyze plot &amp;gt; xxx.svg&amp;quot;, look at the svg file using a web browser.&lt;br /&gt;
&lt;br /&gt;
Crontab entry to start midas: (install in the midas user crontab, not root crontab)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
su - midasuser&lt;br /&gt;
crontab -l&lt;br /&gt;
#@reboot /bin/bash -l -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
#@reboot /bin/tcsh -c &amp;quot;/home/trinat/bin/start-daq-applications&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install apache httpd proxy for midas and elog =&lt;br /&gt;
&lt;br /&gt;
This will configure the HTTPS/SSL certificate using &amp;quot;certbot&amp;quot; and &amp;quot;letsencrypt&amp;quot; and configure an HTTPS web server using apache2.&lt;br /&gt;
&lt;br /&gt;
First, configure apache2:&lt;br /&gt;
&lt;br /&gt;
* execute these commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install apache2&lt;br /&gt;
cd /etc/apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file conf-available/ssl-daq14.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSLSessionCache         shmcb:/run/httpd/sslcache(512000)&lt;br /&gt;
SSLSessionCacheTimeout  300&lt;br /&gt;
SSLRandomSeed startup file:/dev/urandom  256&lt;br /&gt;
SSLRandomSeed connect builtin&lt;br /&gt;
SSLCryptoDevice builtin&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create new file sites-available/daq14-ssl.conf # use actual hostname instead of daq14&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;IfModule mod_ssl.c&amp;gt;&lt;br /&gt;
    &amp;lt;VirtualHost *:443&amp;gt;&lt;br /&gt;
        ServerName daq14.triumf.ca&lt;br /&gt;
        DocumentRoot /var/www/html&lt;br /&gt;
        ErrorLog /var/log/apache2/daq14.log&lt;br /&gt;
        SSLEngine on&lt;br /&gt;
        # note SSLProtocol, SSLCipherSuite and some other settings are overwritten by /etc/letsencrypt/options-ssl-apache.conf&lt;br /&gt;
        SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1&lt;br /&gt;
        SSLCipherSuite HIGH:MEDIUM:!aNULL:!MD5:!SEED:!IDEA:!RC4&lt;br /&gt;
        ## use port specified in elogd.cfg&lt;br /&gt;
        #ProxyPass /elog/ http://localhost:8082/ retry=1 &lt;br /&gt;
        ## use mhttpd port&lt;br /&gt;
        #ProxyPass /      http://localhost:8080/ retry=1 &lt;br /&gt;
        Header always set Strict-Transport-Security &amp;quot;max-age=31536000; includeSubDomains&amp;quot;&lt;br /&gt;
        &amp;lt;Location /&amp;gt;&lt;br /&gt;
            SSLRequireSSL&lt;br /&gt;
            AuthType Basic&lt;br /&gt;
            AuthName &amp;quot;DAQ password protected site&amp;quot;&lt;br /&gt;
            Require valid-user&lt;br /&gt;
            # create password file: touch /etc/apache2/htpasswd&lt;br /&gt;
            # to add new user or change password: htpasswd /etc/apache2/htpasswd username&lt;br /&gt;
            AuthUserFile /etc/apache2/htpasswd&lt;br /&gt;
        &amp;lt;/Location&amp;gt;&lt;br /&gt;
        #SSLCertificateFile /root/server.cert &lt;br /&gt;
        #SSLCertificateKeyFile /root/server.key &lt;br /&gt;
    &amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;
&amp;lt;/IfModule&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* stop apache2 from listening on port 80: edit /etc/apache2/ports.conf, comment-out the line &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* enable ssl module&lt;br /&gt;
* enable new configurations&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod ssl&lt;br /&gt;
a2enmod headers&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
a2enconf ssl-daq14&lt;br /&gt;
a2ensite daq14-ssl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* disable default ssl sites&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2dissite 000-default-le-ssl&lt;br /&gt;
a2dissite 000-default&lt;br /&gt;
ls -l /etc/apache2/sites-enabled/ ### should show only daq14-ssl.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that there are no syntax problems&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable and start apache2:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable apache2&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 may fail to start, look in /var/log/apache2/error.log and /var/log/apache2/daq14.log&lt;br /&gt;
* if it says &amp;quot;Failed to configure ... certificate&amp;quot;, proceed to the step for setting certbot.&lt;br /&gt;
* try to access https://daq14.triumf.ca&lt;br /&gt;
** you should see a complaint about self-signed certificate&lt;br /&gt;
** you should see a request for password (do not login yet)&lt;br /&gt;
** if you get &amp;quot;connection refused&amp;quot;, HTTPS port 443 may need to be enabled in the local firewall, look at documentation for ufw.&lt;br /&gt;
Second, configure certbot:&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2018-01-18 certbot requires use of http port 80 to get the initial https certificate,&lt;br /&gt;
renewal can continue to use the https port 443)&lt;br /&gt;
&lt;br /&gt;
(Note: as of 2019-01-?? certbot requires use of port 80 for renewals)&lt;br /&gt;
&lt;br /&gt;
(Note: unsurprisingly, this requires outside access to connect with letsencrypt, so won&#039;t work if PC is only accessible from on-site network)&lt;br /&gt;
&lt;br /&gt;
* check that port 80 is not used by anything:&lt;br /&gt;
* netstat -an | grep LISTEN | grep ^tcp | grep 80&lt;br /&gt;
* lsof -P | grep -i tcp | grep LISTEN | grep 80&lt;br /&gt;
* if lsof reports that apache2 is listening on port 80, follow the apache2 instructions above (remove &amp;quot;listen 80&amp;quot; from apache2.conf&lt;br /&gt;
&lt;br /&gt;
* install certbot (if necessary open tcp port 80 in the firewall, see documentation for ufw):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install certbot python3-certbot-apache&lt;br /&gt;
certbot certonly --standalone --installer apache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;activate HTTPS for daq14.triumf.ca&amp;quot; - say ok&lt;br /&gt;
* &amp;quot;enter email address&amp;quot; - enter your own email address&lt;br /&gt;
* &amp;quot;please read terms...&amp;quot; - read the terms and say &amp;quot;agree&amp;quot;&lt;br /&gt;
* it will take a few moments...&lt;br /&gt;
* &amp;quot;congratulations...&amp;quot; - say ok.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot install --apache --cert-name daq14.triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* then answer questions:&lt;br /&gt;
* &amp;quot;choose redirect...&amp;quot; - say &amp;quot;1&amp;quot; (no redirect)&lt;br /&gt;
* look inside /etc/apache2/sites-enabled/daq14-ssl.conf to see that SSLCertificateFile &amp;amp; co point to certbot certificates in&lt;br /&gt;
/etc/letsencrypt/live/daq14.triumf.ca/&lt;br /&gt;
* to check current renewal and to update the certbot config file in /etc/letsencrypt/renewal, run this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
certbot renew --standalone --installer apache --force-renewal&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: this certificate will expire in 3 months, automatic renewal should work with current version of certbot&lt;br /&gt;
&lt;br /&gt;
Third, activate password protection:&lt;br /&gt;
&lt;br /&gt;
* as shown in the config file above, create password file and initial user: (replace &amp;quot;midas&amp;quot; with specific username)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
touch /etc/apache2/htpasswd&lt;br /&gt;
htpasswd /etc/apache2/htpasswd midas&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* restart apache2&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
systemctl status apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
From here:&lt;br /&gt;
* enable proxy for MIDAS mhttpd - uncomment redirect in the config file above&lt;br /&gt;
* enable proxy for ELOG - ditto&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
a2enmod proxy&lt;br /&gt;
a2enmod proxy_http&lt;br /&gt;
apache2ctl configtest&lt;br /&gt;
systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* try accessing MIDAS https://daq14.triumf.ca/ (make sure mhttpd is running)&lt;br /&gt;
* if it&#039;s not working, check odb setting FIXME!&lt;br /&gt;
* try accessing ELog https://daq14.triumf.ca/elog/ (make sure elogd is running)&lt;br /&gt;
* if it&#039;s not working, check elogd.cfg file and make sure&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
SSL                  = 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTE: if certbot fails with errors about &#039;module&#039; object has no attribute &#039;pyopenssl&#039;,&lt;br /&gt;
try this: pip install requests==2.6.0&lt;br /&gt;
&lt;br /&gt;
== generate self-signed certificate ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# cd $HOME&lt;br /&gt;
# openssl req  -nodes -new -x509  -keyout server.key -out server.cert -days 1001&lt;br /&gt;
...+....+..+..........+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+..+...+.........+......+.+...+...+.....+...............+.........+...+.+......+...+...........+....+...+..+......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*....+......+.+...+..+.......+..+...+.......+......+...+..+...+......+....+...............+..+...+....+...........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
......+......+.+..+......+.+......+.....+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.+.....+......+.+.........+......+.....+.+..+...+.......+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*.......+....+......+.....+...+...+.......+..+.+........+.+...+......+..+..........+..+.+...........+...+.......+......+.....+.......+...+.........+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++&lt;br /&gt;
-----&lt;br /&gt;
You are about to be asked to enter information that will be incorporated&lt;br /&gt;
into your certificate request.&lt;br /&gt;
What you are about to enter is what is called a Distinguished Name or a DN.&lt;br /&gt;
There are quite a few fields but you can leave some blank&lt;br /&gt;
For some fields there will be a default value,&lt;br /&gt;
If you enter &#039;.&#039;, the field will be left blank.&lt;br /&gt;
-----&lt;br /&gt;
Country Name (2 letter code) [AU]:CH&lt;br /&gt;
State or Province Name (full name) [Some-State]:Geneve&lt;br /&gt;
Locality Name (eg, city) []:CERN&lt;br /&gt;
Organization Name (eg, company) [Internet Widgits Pty Ltd]:CERN&lt;br /&gt;
Organizational Unit Name (eg, section) []:ALPHA experiment           &lt;br /&gt;
Common Name (e.g. server FQDN or YOUR name) []:alphacpc05.cern.ch&lt;br /&gt;
Email Address []:&lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# &lt;br /&gt;
root@alphacpc05:~# ls -l&lt;br /&gt;
-rw-r--r-- 1 root root 1375 juil. 10 21:43 server.cert&lt;br /&gt;
-rw------- 1 root root 1708 juil. 10 21:42 server.key&lt;br /&gt;
root@alphacpc05:~# systemctl restart apache2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable elog PDF preview =&lt;br /&gt;
&lt;br /&gt;
NOTE: looks like U-24 already has this correctly.&lt;br /&gt;
&lt;br /&gt;
see https://stackoverflow.com/questions/52998331/imagemagick-security-policy-pdf-blocking-conversion&lt;br /&gt;
&lt;br /&gt;
* xemacs -nw /etc/ImageMagick-6/policy.xml&lt;br /&gt;
* remove this section at the end:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;!-- disable ghostscript format types --&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS2&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PS3&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;EPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;PDF&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;policy domain=&amp;quot;coder&amp;quot; rights=&amp;quot;none&amp;quot; pattern=&amp;quot;XPS&amp;quot; /&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install Jupyter notebook =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
From https://jupyter.org/install&lt;br /&gt;
apt install python3-pip&lt;br /&gt;
pip install jupyterlab&lt;br /&gt;
pip install notebook&lt;br /&gt;
~/.local/bin/jupyter notebook&lt;br /&gt;
watch the http://localhost:8888 URL that it printed&lt;br /&gt;
say &amp;quot;no&amp;quot; to offer to start firefox (it will not work!)&lt;br /&gt;
URL is: http://localhost:8888/tree?token=xxx&lt;br /&gt;
from the machine where you are running the web browser (i.e. google-chrome), run (replace trinat@trinatdaq with the username and machine name where you started jupyter)&lt;br /&gt;
open a new shell and run: ssh -v trinat@trinatdaq -L 8888:localhost:8888&lt;br /&gt;
in the web browser, open http://localhost:8888&lt;br /&gt;
this gives us the login page&lt;br /&gt;
in the password or token entry field, put the token from the &amp;quot;tree?token=xxx&amp;quot; above (printed by jupyter on startup)&lt;br /&gt;
push button &amp;quot;login&amp;quot;&lt;br /&gt;
jupyter page should open with the list of files in the trinat home directory&lt;br /&gt;
congratulate Brian with full success&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install ZFS quota report =&lt;br /&gt;
&lt;br /&gt;
If there are any ZFS volumes, install script to report disk and quota usage&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/quotareport&lt;br /&gt;
git pull&lt;br /&gt;
mkdir /var/www/html/zfsquotareport&lt;br /&gt;
cp -pv ~/git/scripts/quotareport/sorttable.js /var/www/html/zfsquotareport/&lt;br /&gt;
ln -s $PWD/zfsquotareport.perl /etc/cron.daily/&lt;br /&gt;
touch /etc/crontab&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If httpd is configured to redirect &amp;quot;/&amp;quot; to MIDAS mhttpd:&lt;br /&gt;
* add following to /etc/apache2/sites-enabled/xxx-ssl.conf in front of &amp;quot;ProxyPass / ...&amp;quot;&lt;br /&gt;
* run &amp;quot;systemctl reload apache2&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
## do not proxy zfs quota report directory &lt;br /&gt;
ProxyPass /zfsquotareport/ ! &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Install PHP =&lt;br /&gt;
&lt;br /&gt;
* apt install php libapache2-mod-php&lt;br /&gt;
* systemctl restart apache2&lt;br /&gt;
* create /var/www/html/info.php&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;?php &lt;br /&gt;
 &lt;br /&gt;
phpinfo(); &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* open https://daq00.triumf.ca/info.php&lt;br /&gt;
&lt;br /&gt;
= Configure TRIUMF printers =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop cups&lt;br /&gt;
systemctl stop cups-browsed.service&lt;br /&gt;
systemctl disable cups&lt;br /&gt;
systemctl disable cups-browsed.service&lt;br /&gt;
systemctl stop snap.cups.cupsd.service&lt;br /&gt;
systemctl stop snap.cups.cups-browsed.service&lt;br /&gt;
systemctl disable snap.cups.cupsd.service&lt;br /&gt;
systemctl disable snap.cups.cups-browsed.service&lt;br /&gt;
echo &amp;quot;ServerName printers.triumf.ca&amp;quot; &amp;gt; /etc/cups/client.conf&lt;br /&gt;
lpstat -a&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable core dumps =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 installs the apport package&lt;br /&gt;
which disabled core dumps from user applications. (google it up!).&lt;br /&gt;
It is not meant to do this and documentation claims that&lt;br /&gt;
it is not installed and not enabled by default. Oh, well...&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt purge apport&lt;br /&gt;
apt autoremove ### will remove apport-symptoms and a few other packages&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
After this, core dumps are written to file &amp;quot;core&amp;quot; in the current directory.&lt;br /&gt;
See /proc/sys/kernel/core_pattern and /proc/sys/kernel/core_uses_pid.&lt;br /&gt;
&lt;br /&gt;
Enable core dump file names to include process id, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 1 &amp;gt; /proc/sys/kernel/core_uses_pid&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable debugger =&lt;br /&gt;
&lt;br /&gt;
By default, Ubuntu LTS 20.04 does not permit debugger to attach and debug&lt;br /&gt;
already running programs. To enable it, add following to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo &amp;quot;echo 0 &amp;gt; /proc/sys/kernel/yama/ptrace_scope&amp;quot; &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable Ubuntu Pro nag =&lt;br /&gt;
&lt;br /&gt;
best I can tell, impossible at this time.&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! does nothing !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
pro config set apt_news=false&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! breaks automatic updates because 20apt-esm-hook.conf is missing !!!&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;apt upgrade&amp;quot; requests Ubuntu Pro or esm-apps, disable the nag:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! likely same as above, breaks automatic updates !!!&lt;br /&gt;
&lt;br /&gt;
* comment out /etc/apt/apt.conf.d/20apt-esm-hook.conf&lt;br /&gt;
&lt;br /&gt;
== do not do this ==&lt;br /&gt;
&lt;br /&gt;
!!! removes too many packages !!!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove ubuntu-pro-client&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update packages =&lt;br /&gt;
&lt;br /&gt;
* apt update # update package list&lt;br /&gt;
* apt upgrade # install updated packages and update &amp;quot;kept back&amp;quot; packages&lt;br /&gt;
* apt autoremove # remove packages that apt thinks should be removed&lt;br /&gt;
&lt;br /&gt;
= Cleanup residual configs =&lt;br /&gt;
&lt;br /&gt;
* apt list &#039;~c&#039;&lt;br /&gt;
* apt purge &#039;~c&#039;&lt;br /&gt;
&lt;br /&gt;
= Install firefox-esr =&lt;br /&gt;
&lt;br /&gt;
install firefox-esr here&lt;br /&gt;
&lt;br /&gt;
= Finish installation =&lt;br /&gt;
&lt;br /&gt;
Congratulations. There is nothing more to do!&lt;br /&gt;
&lt;br /&gt;
* reboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Update to new version of Ubuntu =&lt;br /&gt;
&lt;br /&gt;
* run &amp;quot;do-release-upgrade -c&amp;quot;&lt;br /&gt;
* if it does not report new release Ubuntu 24, check /etc/update-manager/release-upgrades has &amp;quot;Prompt=lts&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Update Ubuntu LTS 20.04 to LTS 22.04 ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# reboot to clear out all updates&lt;br /&gt;
# vi /etc/update-manager/release-upgrades # set &amp;quot;Prompt=normal&amp;quot;&lt;br /&gt;
# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;22.04 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
# do-release-upgrade&lt;br /&gt;
...&lt;br /&gt;
say yes...&lt;br /&gt;
...&lt;br /&gt;
login.defs, say &amp;quot;Y&amp;quot; (erase local changes, use packaged version)&lt;br /&gt;
/etc/systemd/resolved.conf, say &amp;quot;Y&amp;quot; (same as above)&lt;br /&gt;
firefox snap, say yes&lt;br /&gt;
unable to reach snap store, say &amp;quot;skip&amp;quot;&lt;br /&gt;
/etc/gmond.conf, say &amp;quot;Y&amp;quot;&lt;br /&gt;
/var/yp/Makefile, say &amp;quot;install the package maintainer&#039;s version&amp;quot;&lt;br /&gt;
/etc/ypserv.conf, same thing&lt;br /&gt;
/etc/ypserv.securenets, same thing&lt;br /&gt;
/etc/default/nis, same thing&lt;br /&gt;
/etc/speech-dispatcher/modules/mary-generic.conf, same thing&lt;br /&gt;
/etc/apt/apt.conf.d/50unattended-upgrades, same thing&lt;br /&gt;
...&lt;br /&gt;
278 packages are going to be removed, say yes&lt;br /&gt;
...&lt;br /&gt;
restart required, say yes&lt;br /&gt;
...&lt;br /&gt;
no ping... yes ping...&lt;br /&gt;
...&lt;br /&gt;
ssh daqubuntu, ok&lt;br /&gt;
apt update, fail, DNS does not work, &amp;quot;host security.ubuntu.com&amp;quot; does not resolve.&lt;br /&gt;
fix resolver per https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#Disable_NetworkManager&lt;br /&gt;
apt update, apt upgrade now works, 0 packages to update&lt;br /&gt;
NIS does not work.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== midm9a ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
login.defs&lt;br /&gt;
firefox snap&lt;br /&gt;
gmond.conf&lt;br /&gt;
ypserv&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
unattended-upgrades&lt;br /&gt;
amanda-security.conf&lt;br /&gt;
remove obsolete (no)&lt;br /&gt;
reboot&lt;br /&gt;
configure dns&lt;br /&gt;
reenable nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq17 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox snap&lt;br /&gt;
imagemagick policy.xml&lt;br /&gt;
gmond.conf&lt;br /&gt;
chrony.conf&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
ypserv.conf&lt;br /&gt;
ypserv.securenets&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
50unattended-upgrades&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daq00 ===&lt;br /&gt;
&lt;br /&gt;
per https://serverpilot.io/docs/how-to-upgrade-ubuntu-20.04-to-22.04/&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
if it exists &amp;quot;too soon&amp;quot; without doing anything, run it without &amp;quot;-f xxx&amp;quot;, most likely it does not like something about this machine. in case of daq00 it did not like how the EFI partitions were mounted. after fixing it, non-interactive upgrade was successful.&lt;br /&gt;
&lt;br /&gt;
=== isdaq08 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== upgrade U-22 to U-24 ==&lt;br /&gt;
&lt;br /&gt;
generic instructions. below are notes from upgrades of specific machines.&lt;br /&gt;
&lt;br /&gt;
NOTE: at CERN saw installation getting stuck on restart of autofs (automount, rsyslogd 100% CPU, huge /var/log/syslog), stop autofs before upgrade?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cleanup zsys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
maybe: if snap is already removed, remove firefox to prevent snap from reinstalling.&lt;br /&gt;
install non-snap firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
remove thunderbird to prevent installation of snap thunderbird in U-24&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mount EFI partition as /boot/efi, otherwise upgrade bombs&lt;br /&gt;
usually mount /dev/sda1 /boot/efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums -ce&lt;br /&gt;
apt -y remove desktop-base # causes installer crash&lt;br /&gt;
apt -y remove thunderbird  # avoid forced conversion to snap&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
do-release-upgrade -c      # confirm upgrade will be to U-24&lt;br /&gt;
do-release-upgrade&lt;br /&gt;
# say &amp;quot;y&amp;quot; to all questions&lt;br /&gt;
# after installation starts, accept default answers to all questions&lt;br /&gt;
# should run for about 1 hour or so&lt;br /&gt;
# after upgrade finishes&lt;br /&gt;
apt update&lt;br /&gt;
apt -y upgrade&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
post upgrade:&lt;br /&gt;
&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
&lt;br /&gt;
if installation bombs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # will tell us to run &amp;quot;apt --fix-broken install&amp;quot;, do it&lt;br /&gt;
apt --fix-broken install&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should resume the upgrade, will run for a long time&lt;br /&gt;
apt update&lt;br /&gt;
apt upgrade # should do nothing&lt;br /&gt;
apt autoremove&lt;br /&gt;
shutdown -r now&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== daqubuntu, U-24 ===&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check for modified config files that make upgrade unhappy, deal with all files reported by debsums.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# debsums -ce&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/ypserv.conf&lt;br /&gt;
/etc/ypserv.securenets&lt;br /&gt;
/var/yp/Makefile&lt;br /&gt;
/etc/update-manager/release-upgrades&lt;br /&gt;
/etc/apt/apt.conf.d/10periodic&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
* restore original /etc/apt/apt.conf.d/10periodic&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
APT::Periodic::Update-Package-Lists &amp;quot;1&amp;quot;; &lt;br /&gt;
APT::Periodic::Download-Upgradeable-Packages &amp;quot;0&amp;quot;; &lt;br /&gt;
APT::Periodic::AutocleanInterval &amp;quot;0&amp;quot;; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* restore original release-upgrades: &amp;quot;Prompt: lts&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
&lt;br /&gt;
Check for upgrade:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# do-release-upgrade -c&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
There is no development version of an LTS available.&lt;br /&gt;
To upgrade to the latest non-LTS development release &lt;br /&gt;
set Prompt=normal in /etc/update-manager/release-upgrades.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Run the upgrade:&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
&lt;br /&gt;
Post upgrade:&lt;br /&gt;
&lt;br /&gt;
* configure DNS&lt;br /&gt;
* apt -y install linux-generic-hwe-22.04&lt;br /&gt;
* /bin/cp -v ~/git/scripts/etc/99apt-conf-ko /etc/apt/apt.conf.d/ # restore nightly updates&lt;br /&gt;
* /bin/rm /etc/apt/apt.conf.d/20apt-esm-hook.conf # remove the ubuntu-pro nag&lt;br /&gt;
* install missing packages&lt;br /&gt;
* restore ganglia&lt;br /&gt;
* restore nis&lt;br /&gt;
* check zpool status, may need zpool upgrade&lt;br /&gt;
* cd /etc/apt/sources.list.d, reenable 3rd party repos (mozilla, google, etc)&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
=== daq14, U-20-22-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade&lt;br /&gt;
* apt -y install linux-image-generic-hwe-20.04 linux-tools-virtual-hwe-20.04 ### install kernel 5.15&lt;br /&gt;
* shutdown -r now&lt;br /&gt;
* stuck waiting for daq14 to shutdown...&lt;br /&gt;
* reboot into kernel 5.15&lt;br /&gt;
* ???&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ~&lt;br /&gt;
apt -y install debsums&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
/etc/sudoers&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apache2 restore original ports.conf, uncomment &amp;quot;Listen 80&amp;quot;&lt;br /&gt;
* cp -pv /etc/dnsmasq.conf.dpkg-dist /etc/dnsmasq.conf&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* edit /etc/yp.conf, remove everything after &amp;quot;# ypserver ypserver.network.com&amp;quot;&lt;br /&gt;
* &amp;quot;debsums -ce&amp;quot; is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* runs for a long time&lt;br /&gt;
* stuck on &amp;quot;/etc/default/nis&amp;quot;, type &amp;quot;Y&amp;quot;, press enter, nothing for a bit, then resumes running&lt;br /&gt;
* finished&lt;br /&gt;
* configure DNS&lt;br /&gt;
* reboot&lt;br /&gt;
* have kernel 6.8&lt;br /&gt;
* apt update; apt upgrade&lt;br /&gt;
* apt upgrade guile-2.2-libs ### would not auto-update, &amp;quot;kept back&amp;quot;, has to be done by hand&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* diff /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* cp -pv /etc/default/nis.dpkg-dist  /etc/default/nis&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
debsums: missing file /etc/init.d/nis (from nis package)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* we ignore this and run the update&lt;br /&gt;
* do-release-upgrade -c&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Checking for a new Ubuntu release&lt;br /&gt;
New release &#039;24.04.1 LTS&#039; available.&lt;br /&gt;
Run &#039;do-release-upgrade&#039; to upgrade to it.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombs out without any error messages&lt;br /&gt;
* in /var/log/dist-upgrade/main.log reports &amp;quot;Failed to find a replacement for xapp&amp;quot; and other packages&lt;br /&gt;
* apt remove xapp usrmerge ureadahead thunderbird-gnome-support&lt;br /&gt;
* no go, complains about even more packages.&lt;br /&gt;
* apt list | grep installed | grep -v jammy ### show packages installed from non-ubuntu sources&lt;br /&gt;
* remove all packages marked &amp;quot;install,local&amp;quot; ### ubuntu updater does not know where they came from and so cannot update them.&lt;br /&gt;
* apt remove desktop-base ### not happy about this package in /var/log/dist-upgrade/apt.log&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* running for a long time...&lt;br /&gt;
&lt;br /&gt;
=== alpha04 U-20-24 ===&lt;br /&gt;
&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* reboot into latest kernel (already done)&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alpha04:~# debsums -ce&lt;br /&gt;
/etc/dnsmasq.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
root@alpha04:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* move /etc/dnsmasq.conf to /etc/dnsmasq.d/alpha04.conf&lt;br /&gt;
* apt remove dnsmasq&lt;br /&gt;
* apt remove ganglia-monitor&lt;br /&gt;
* apt remove nis&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* debsums -ce ### is now empty&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* it runs for a long time...&lt;br /&gt;
* complained about /etc/fwupd config files, not sure why...&lt;br /&gt;
* finished&lt;br /&gt;
* apt update, apt upgrade, apt autoremove&lt;br /&gt;
* restore dnsmasq: apt install dnsmasq, systemctl status dnsmasq&lt;br /&gt;
* restore ganglia, per instructions&lt;br /&gt;
* restore NIS: apt -y install rpcbind nis, ypwhich, ypwhich -m&lt;br /&gt;
* zpool upgrade rpool ### also upgrade any other zfs pools, see zpool status&lt;br /&gt;
* remove unwanted packages, per instructions&lt;br /&gt;
* run gonodeinfo&lt;br /&gt;
* reboot&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== vera00 U20-22-24 ==&lt;br /&gt;
&lt;br /&gt;
* everything same as daq14 for U20-22&lt;br /&gt;
* kernel is still 5.15&lt;br /&gt;
* U22-24 is going...&lt;br /&gt;
* stuck for a few minutes on /etc/fwupd config files&lt;br /&gt;
* have kernel 6.8.0-49&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* reboot&lt;br /&gt;
* same steps as daq14&lt;br /&gt;
* done&lt;br /&gt;
&lt;br /&gt;
== phaarmonster U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/amandahosts&lt;br /&gt;
/etc/apache2/ports.conf&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* do-release-upgrade -c ### reports U24.04.1&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive ### bombs&lt;br /&gt;
* apt remove desktop-base; apt autoremove&lt;br /&gt;
* do-release-upgrade ### (interactive) runs ok&lt;br /&gt;
* bombed !!!&lt;br /&gt;
* apt upgrade spews errors and tells us to run &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* apt --fix-broken install ### runs&lt;br /&gt;
* bombs with thunderbird snap errors&lt;br /&gt;
* again... no go&lt;br /&gt;
* thunderbird snap complains about mounting /home, but /home is a symlink&lt;br /&gt;
* rm /home, mkdir /home&lt;br /&gt;
* again, runs ok&lt;br /&gt;
* asks about /etc/fwupd/fwupd.conf - say &amp;quot;Y&amp;quot; to install updated package version&lt;br /&gt;
* apt install completes&lt;br /&gt;
* apt update; apt upgrade ### running for a long time...&lt;br /&gt;
* finished&lt;br /&gt;
* install missing packages, etc&lt;br /&gt;
* reboot&lt;br /&gt;
* long wait... came back&lt;br /&gt;
* DNS does now work, systemd-resolved missing, apt install systemd-resolved, &amp;quot;configure DNS&amp;quot;&lt;br /&gt;
* done.&lt;br /&gt;
&lt;br /&gt;
== isdaq10 U22-24 ==&lt;br /&gt;
&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed on desktop-base, &amp;quot;apt remove desktop-base; apt autoremove&amp;quot;&lt;br /&gt;
* bombed with errors&lt;br /&gt;
* running &amp;quot;apt --fix-broken install&amp;quot;&lt;br /&gt;
* complained about thunderbird snap&lt;br /&gt;
* complained about /etc/fwupd/fwupd.conf (say Y)&lt;br /&gt;
* finished ok&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade ### reports &amp;quot;1382 upgraded, 140 newly installed, 0 to remove and 29 not upgraded&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== iris01 ==&lt;br /&gt;
&lt;br /&gt;
* debsums -ce&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/etc/ganglia/gmond.conf&lt;br /&gt;
/etc/default/nis&lt;br /&gt;
/etc/yp.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove desktop-base&lt;br /&gt;
* apt remove thunderbird&lt;br /&gt;
* apt autoremove&lt;br /&gt;
* do-release-upgrade -f DistUpgradeViewNonInteractive&lt;br /&gt;
* bombed with dpkg errors:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
hplip wants wrong python&lt;br /&gt;
ganglia-monitor wants wrong libapr1&lt;br /&gt;
sssd-ad wants bunch of wrong libraries&lt;br /&gt;
xemacs21-mule&lt;br /&gt;
libnfsidmap1 wants libldap2&lt;br /&gt;
adn so forth...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt --fix-broken install -y&lt;br /&gt;
* bombs on ganglia - ganglia group absent from /etc/groups&lt;br /&gt;
* fix group ganglia by hand, remove ganglia group from NIS on isdaq00&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== iris00 ==&lt;br /&gt;
&lt;br /&gt;
* stuck on &amp;quot;autofs: restarting&amp;quot;, login as root, kill iris midas, kill automount, systemctl restart autofs, noble got unstuck, ctrl-c systemctl restart autofs&lt;br /&gt;
* noble running...&lt;br /&gt;
* bombed with dpkg errors&lt;br /&gt;
* check ganglia user, group - both ok&lt;br /&gt;
* apt --fix-broken install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
== tigstore01 ==&lt;br /&gt;
&lt;br /&gt;
* no bomb-out&lt;br /&gt;
&lt;br /&gt;
== midm9b ==&lt;br /&gt;
&lt;br /&gt;
* apt remove desktop-base thunderbird&lt;br /&gt;
* bombed&lt;br /&gt;
* apt --fix-broken-install&lt;br /&gt;
* apt upgrade&lt;br /&gt;
&lt;br /&gt;
= Upgrade to new version of Debian =&lt;br /&gt;
&lt;br /&gt;
https://www.debian.org/releases/bookworm/amd64/release-notes/ch-upgrading.en.html&lt;br /&gt;
&lt;br /&gt;
== 32-bit VME processor Debian 11 to 12 ==&lt;br /&gt;
&lt;br /&gt;
* cd git/scripts; git pull; cd ~&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade&lt;br /&gt;
* edit /etc/apt/sources.list&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
deb http://deb.debian.org/debian/ bookworm main&lt;br /&gt;
#deb http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
#deb http://deb.debian.org/debian/ buster main&lt;br /&gt;
#deb-src http://deb.debian.org/debian/ bullseye main&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt update&lt;br /&gt;
* apt upgrade --without-new-pkgs&lt;br /&gt;
* apt full-upgrade&lt;br /&gt;
* apt list &#039;~c&#039;; apt purge &#039;~c&#039; # purge left-over config files [residual-config]&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Ubuntu package manager =&lt;br /&gt;
&lt;br /&gt;
* apt-get install xxx # install package xxx&lt;br /&gt;
* apt-get update&lt;br /&gt;
* apt-get upgrade&lt;br /&gt;
* apt-get dist-upgrade&lt;br /&gt;
* apt-get autoremove # remove automatically installed packages required by a removed package&lt;br /&gt;
* apt-get remove xxx # remove package xxx&lt;br /&gt;
* apt-cache search . # list all available packages&lt;br /&gt;
* apt-cache show &amp;quot;.&amp;quot; | grep ^Package # list al available packages&lt;br /&gt;
* apt-cache madison root-system # show all available versions of package root-system&lt;br /&gt;
* apt list # list all installed packages&lt;br /&gt;
* dpkg --listfiles libpng16-16 # list all files from this package&lt;br /&gt;
* apt list --installed # list all installed packages&lt;br /&gt;
* dpkg -S /bin/bash # what package provides this file?&lt;br /&gt;
* dpkg -L bash # what files provided by this package?&lt;br /&gt;
* debsums -ce # show modified config files&lt;br /&gt;
* apt-config dump # show apt configuration&lt;br /&gt;
* apt purge &#039;~c&#039; # purge all [residual-config] packages&lt;br /&gt;
* ls -l /var/lib/dpkg/info/ # show post-install scripts&lt;br /&gt;
&lt;br /&gt;
= Ubuntu zsys =&lt;br /&gt;
&lt;br /&gt;
NOTE: DO NOT USE ZSYS, see https://github.com/ubuntu/zsys/issues/218 and https://github.com/ubuntu/zsys/issues/230&lt;br /&gt;
&lt;br /&gt;
* scripted removal of old snapshots (replace &amp;quot;echo zfs destroy&amp;quot; with &amp;quot;zfs destroy&amp;quot;)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list -t all | cut -f1 -d &amp;quot; &amp;quot; | grep autozsys | xargs -n1 echo zfs destroy&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* manual removal of old snapshots&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zsysctl show&lt;br /&gt;
zsysctl state remove xy69ye -s&lt;br /&gt;
zsysctl state remove xy69ye&lt;br /&gt;
zsysctl state remove xy69ye -u wheel&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt remove zsys&lt;br /&gt;
&lt;br /&gt;
NOTE: old zsys snapshots must be cleaned manually, &amp;quot;zsysctl state remove xxx --system&amp;quot; is broken and does not remove user data snapshots&lt;br /&gt;
&lt;br /&gt;
* manages system snapshots&lt;br /&gt;
* documentation: https://github.com/ubuntu/zsys&lt;br /&gt;
* documentation: (go to next article via link &amp;quot;newer&amp;quot; at the bottom) https://didrocks.fr/2020/05/21/zfs-focus-on-ubuntu-20.04-lts-whats-new/&lt;br /&gt;
* ubuntu 20.04 bug, too many snapshots cause /boot to become full and updates fail. https://github.com/ubuntu/zsys/issues/155&lt;br /&gt;
* solution: use custom /etc/zsys.conf, limit number of snapshots to 10, see trinatdaq:/etc/zsys.conf&lt;br /&gt;
* zsys commands:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
update-grub # list of all snapshots, errors if some snapshots are broken&lt;br /&gt;
zsysctl state remove lnc0k7 --system # remove snapshot&lt;br /&gt;
xemacs -nw /etc/zsys.conf; zsysctl service reload; zsysctl service gc # cause gc to run with new settings in zsys.conf&lt;br /&gt;
zfs list -r -t snapshot -o name,used,referenced,creation bpool/BOOT # list snapshots&lt;br /&gt;
zsysctl show # show snapshots&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu cloning =&lt;br /&gt;
&lt;br /&gt;
to clone a ubuntu image:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /nfsroot/lxcpet&lt;br /&gt;
emacs -nw etc/hostname ### change hostname&lt;br /&gt;
emacs -nw etc/mailname ### change hostname (debian 11)&lt;br /&gt;
emacs -nw etc/defaultdomain ### change the NIS domainname&lt;br /&gt;
emacs -nw etc/yp.conf ### change the NIS server&lt;br /&gt;
cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Ubuntu boot loader =&lt;br /&gt;
&lt;br /&gt;
== maintenance commands ==&lt;br /&gt;
&lt;br /&gt;
* update-initramfs -v -u&lt;br /&gt;
* grub-install /dev/sda&lt;br /&gt;
&lt;br /&gt;
= Convert from single to dual mirrored ZFS SSD =&lt;br /&gt;
&lt;br /&gt;
Assuming Ubuntu LTS 22.04 with &amp;quot;instal on ZFS&amp;quot; option, we will&lt;br /&gt;
add a second SSD, configure ZFS to use both SSDs in mirrored&lt;br /&gt;
configuration and setup grub to boot from either SSD. This&lt;br /&gt;
is intended to create a full redundant system where failure&lt;br /&gt;
of either SSD does not break the system.&lt;br /&gt;
&lt;br /&gt;
== partition ==&lt;br /&gt;
&lt;br /&gt;
* identify first SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* connect second SSD of identical size&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ./smart-status.perl &lt;br /&gt;
        Disk                    model               serial     temperature  realloc  pending   uncorr  CRC err     RRER   Errors     Link&lt;br /&gt;
    /dev/sda  WD Blue SA510 2.5 250GB         22243Z803769              24        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
    /dev/sdb  WD Blue SA510 2.5 250GB         22243Z803852              25        .        ?        ?        .        ?        .      6.0&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* if second SSD is not autodetected, reboot&lt;br /&gt;
* Clone partition table automatically&lt;br /&gt;
If both SSDs are identical size, use this simpler method of duplicating the partition table:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# sfdisk -d /dev/sda &amp;gt; part_table&lt;br /&gt;
root@midm9b:~# grep -v ^label-id part_table | sed -e &#039;s/, *uuid=[0-9A-F-]*//&#039; | sfdisk /dev/sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The grep and sed in the second command are there to prevent disk ID and partition IDs from being cloned. Alternatively the part_table file can be edited manually to remove the label-id line and the uuid entries from the individual partitions.&lt;br /&gt;
&lt;br /&gt;
* Clone partition table manually (e.g. for different size disks)&lt;br /&gt;
* list partition table of first SSD:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create identical partitions on second SSD, use sector numbers from above.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# gdisk /dev/sdb&lt;br /&gt;
GPT fdisk (gdisk) version 1.0.8&lt;br /&gt;
&lt;br /&gt;
Partition table scan:&lt;br /&gt;
  MBR: not present&lt;br /&gt;
  BSD: not present&lt;br /&gt;
  APM: not present&lt;br /&gt;
  GPT: not present&lt;br /&gt;
&lt;br /&gt;
Creating new GPT entries in memory.&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (1-128, default 1): &lt;br /&gt;
First sector (34-488397134, default = 2048) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (2048-488397134, default = 488397134) or {+-}size{KMGTP}: 1050623&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): ef00&lt;br /&gt;
Changed type of partition to &#039;EFI system partition&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (2-128, default 2): &lt;br /&gt;
First sector (34-488397134, default = 1050624) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (1050624-488397134, default = 488397134) or {+-}size{KMGTP}: 5244927&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): 8200&lt;br /&gt;
Changed type of partition to &#039;Linux swap&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (3-128, default 3): &lt;br /&gt;
First sector (34-488397134, default = 5244928) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (5244928-488397134, default = 488397134) or {+-}size{KMGTP}: 9439231&lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): be00&lt;br /&gt;
Changed type of partition to &#039;Solaris boot&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): n&lt;br /&gt;
Partition number (4-128, default 4): &lt;br /&gt;
First sector (34-488397134, default = 9439232) or {+-}size{KMGTP}: &lt;br /&gt;
Last sector (9439232-488397134, default = 488397134) or {+-}size{KMGTP}: &lt;br /&gt;
Current type is 8300 (Linux filesystem)&lt;br /&gt;
Hex code or GUID (L to show codes, Enter = 8300): bf00&lt;br /&gt;
Changed type of partition to &#039;Solaris root&#039;&lt;br /&gt;
&lt;br /&gt;
Command (? for help): w&lt;br /&gt;
&lt;br /&gt;
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING&lt;br /&gt;
PARTITIONS!!&lt;br /&gt;
&lt;br /&gt;
Do you want to proceed? (Y/N): y&lt;br /&gt;
OK; writing new GUID partition table (GPT) to /dev/sdb.&lt;br /&gt;
The operation has completed successfully.&lt;br /&gt;
root@midm9b:~# fdisk -l /dev/sda /dev/sdb&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 951A4174-B4C6-400D-99F5-BE9B5627FA8E&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Disk /dev/sdb: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: EB251739-30C6-422F-A505-5887B5A0B603&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sdb1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sdb2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sdb3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sdb4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update ZFS pools ==&lt;br /&gt;
&lt;br /&gt;
* identify second SSD partitions&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part2 -&amp;gt; ../../sda2&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part2 -&amp;gt; ../../sdb2&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert bpool from single disk to mirrored disk:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                   ONLINE       0     0     0&lt;br /&gt;
	  99e03dc0-7d4d-f24b-8fa1-f042b9f135db  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                    STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                   ONLINE       0     0     0&lt;br /&gt;
	  f6fd54f8-3af7-b943-ae3d-a4e480537fb9  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# zpool attach bpool 99e03dc0-7d4d-f24b-8fa1-f042b9f135db /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3&lt;br /&gt;
root@midm9b:~# zpool status bpool&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* convert rpool&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ls -l /dev/disk/by-id/ata*part4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 18:37 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803769-part4 -&amp;gt; ../../sda4&lt;br /&gt;
lrwxrwxrwx 1 root root 10 Jan 20 19:34 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4 -&amp;gt; ../../sdb4&lt;br /&gt;
root@midm9b:~# zpool attach rpool f6fd54f8-3af7-b943-ae3d-a4e480537fb9 /dev/disk/by-id/ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4&lt;br /&gt;
root@midm9b:~# zpool status rpool&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
status: One or more devices is currently being resilvered.  The pool will&lt;br /&gt;
	continue to function, possibly in a degraded state.&lt;br /&gt;
action: Wait for the resilver to complete.&lt;br /&gt;
  scan: resilver in progress since Fri Jan 20 19:40:45 2023&lt;br /&gt;
	5.83G scanned at 664M/s, 2.92M issued at 332K/s, 9.11G total&lt;br /&gt;
	0B resilvered, 0.03% done, no estimated completion time&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* wait for resilver to complete&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# zpool status&lt;br /&gt;
  pool: bpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 247M in 00:00:00 with 0 errors on Fri Jan 20 19:39:40 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	bpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    99e03dc0-7d4d-f24b-8fa1-f042b9f135db            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part3  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&lt;br /&gt;
  pool: rpool&lt;br /&gt;
 state: ONLINE&lt;br /&gt;
  scan: resilvered 9.65G in 00:00:36 with 0 errors on Fri Jan 20 19:41:21 2023&lt;br /&gt;
config:&lt;br /&gt;
&lt;br /&gt;
	NAME                                                STATE     READ WRITE CKSUM&lt;br /&gt;
	rpool                                               ONLINE       0     0     0&lt;br /&gt;
	  mirror-0                                          ONLINE       0     0     0&lt;br /&gt;
	    f6fd54f8-3af7-b943-ae3d-a4e480537fb9            ONLINE       0     0     0&lt;br /&gt;
	    ata-WD_Blue_SA510_2.5_250GB_22243Z803852-part4  ONLINE       0     0     0&lt;br /&gt;
&lt;br /&gt;
errors: No known data errors&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== update boot loader ==&lt;br /&gt;
&lt;br /&gt;
INSTALL SYSLINUX: https://daq00.triumf.ca/DaqWiki/index.php/Ubuntu#EFI_boot_using_syslinux&lt;br /&gt;
&lt;br /&gt;
DO *NOT* DO THE FOLOWING:&lt;br /&gt;
&lt;br /&gt;
* create and mount EFI partitions:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# mkfs.msdos /dev/sdb1&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sda&lt;br /&gt;
root@midm9b:~# mkdir /boot/efi-sdb&lt;br /&gt;
root@midm20c:~# blkid | grep vfat ### identify UUID&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;DD89-5081&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;d0cb6be4-2f67-5b42-9b26-9e6905e9f774&amp;quot;&lt;br /&gt;
/dev/sdc1: UUID=&amp;quot;D970-86BA&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;e6d3b5b9-a512-44a2-9205-1a4db06ed2a2&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;DDA1-044C&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTLABEL=&amp;quot;EFI System Partition&amp;quot; PARTUUID=&amp;quot;6dc9dff0-1c13-8045-a906-7803d3074c70&amp;quot;&lt;br /&gt;
root@midm20c:~# cat /etc/fstab | grep vfat ### add mount points with correct UUID&lt;br /&gt;
#UUID=D970-86BA  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DDA1-044C  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
UUID=DD89-5081  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
root@midm9b:~# mount -a&lt;br /&gt;
root@midm9b:~# df -kl&lt;br /&gt;
Filesystem                                       1K-blocks    Used Available Use% Mounted on&lt;br /&gt;
...&lt;br /&gt;
/dev/sda1                                           523244   13720    509524   3% /boot/efi&lt;br /&gt;
/dev/sdb1                                           523244       4    523240   1% /boot/efi-sdb&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# rsync -av /boot/efi/ /boot/efi-sdb/&lt;br /&gt;
sending incremental file list&lt;br /&gt;
EFI/&lt;br /&gt;
...&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sda&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# ls -l /boot/efi-sdb&lt;br /&gt;
total 8&lt;br /&gt;
drwxr-xr-x 4 root root 4096 Jan 19 23:26 EFI&lt;br /&gt;
drwxr-xr-x 5 root root 4096 Jan 19 23:26 grub&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add systemd &amp;quot;nofail&amp;quot; flag to /etc/fstab, without this, systemd will stop booting if one SSD is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
daq00:~$ cat /etc/fstab | grep vfat&lt;br /&gt;
#UUID=31A7-24BE  /boot/efi       vfat    umask=0022,fmask=0022,dmask=0022      0       1&lt;br /&gt;
/dev/sda1 /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
/dev/sdb1 /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup script to update grub on second SSD, it must be run manually after every kernel update&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9b:~# ln -s ~/git/scripts/etc/update_efi_grub.perl ~/&lt;br /&gt;
root@midm9b:~# ~/update_efi_grub.perl -u&lt;br /&gt;
EFI dir: /boot/efi-sda&lt;br /&gt;
/boot/efi-sda: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sda/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sda: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sda/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
EFI dir: /boot/efi-sdb&lt;br /&gt;
/boot/efi-sdb: update grub: rsync  -av --delete-after --modify-window=2 /boot/efi/grub/ /boot/efi-sdb/grub&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 5,313 bytes  received 11 bytes  10,648.00 bytes/sec&lt;br /&gt;
total size is 7,944,644  speedup is 1,492.23&lt;br /&gt;
/boot/efi-sdb: update efi:  rsync  -av --delete-after --modify-window=2 /boot/efi/EFI/  /boot/efi-sdb/EFI&lt;br /&gt;
building file list ... done&lt;br /&gt;
&lt;br /&gt;
sent 216 bytes  received 11 bytes  454.00 bytes/sec&lt;br /&gt;
total size is 5,452,378  speedup is 24,019.29&lt;br /&gt;
root@midm9b:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disable NetworkManager =&lt;br /&gt;
&lt;br /&gt;
== Debian-12 ==&lt;br /&gt;
&lt;br /&gt;
* use netplan, https://www.debian.org/doc/manuals/debian-reference/ch05.en.html#_the_modern_network_configuration_for_cloud&lt;br /&gt;
* apt install netplan.io&lt;br /&gt;
* systemctl enable systemd-networkd&lt;br /&gt;
* systemctl restart systemd-networkd&lt;br /&gt;
* create /etc/netplan/50-dhcp.yaml&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
network:&lt;br /&gt;
  version: 2&lt;br /&gt;
  ethernets:&lt;br /&gt;
    all-en:&lt;br /&gt;
      match:&lt;br /&gt;
        name: &amp;quot;en*&amp;quot;&lt;br /&gt;
      dhcp4: true&lt;br /&gt;
      dhcp6: true&lt;br /&gt;
      ignore-carrier: true ### do not drop IP address if network link drops&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* netplan apply&lt;br /&gt;
* netplan try&lt;br /&gt;
* ifconfig -a ### to check IP address settings&lt;br /&gt;
* netstat -rn ### to check default route&lt;br /&gt;
* cat /etc/resolv.conf ### to check DNS&lt;br /&gt;
* ls -l /run/systemd/netif/leases ### systemd-networkd dhcp leases&lt;br /&gt;
* NOTE: without &amp;quot;ignore-carrier&amp;quot; it will drop the IP address if network link drops, re-do dhcp when links comes back&lt;br /&gt;
* NOTE: wait-network-online will wait for all interfaces to get an IP address&lt;br /&gt;
&lt;br /&gt;
== Ubuntu-20 ==&lt;br /&gt;
&lt;br /&gt;
NOTE: THIS IS BROKEN IN UBUNTU LTS 22.04&lt;br /&gt;
&lt;br /&gt;
NetworkManager is useful for configuring dynamic&lt;br /&gt;
network interfaces, i.e. laptops that often move&lt;br /&gt;
between networks, or connect to multiple choice&lt;br /&gt;
of wifi networks, etc.&lt;br /&gt;
&lt;br /&gt;
For machines with statically configured network interfaces,&lt;br /&gt;
NetworkManager is not necessary.&lt;br /&gt;
&lt;br /&gt;
As it has been observed to become confused and observed&lt;br /&gt;
to malfunction when network links go up and down (it keeps&lt;br /&gt;
unnecessarily reconfiguring the ip address, etc), it can&lt;br /&gt;
be usefuil to disable it.&lt;br /&gt;
&lt;br /&gt;
* list all network interfaces&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /bin/ls -1 /sys/class/net/&lt;br /&gt;
enp0s31f6&lt;br /&gt;
lo&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/network/interfaces:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rename enp0s31f6=eth0&lt;br /&gt;
auto eth0&lt;br /&gt;
iface eth0 inet static&lt;br /&gt;
   address 142.90.120.94/19&lt;br /&gt;
   gateway 142.90.100.18&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* statically configure systemd-resolved&lt;br /&gt;
** create /etc/systemd/resolved.conf.d/resolved.conf with this contents:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=142.90.100.19&lt;br /&gt;
Domains=triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** systemctl restart systemd-resolved&lt;br /&gt;
** resolvectl&lt;br /&gt;
** systemd-analyze cat-config systemd/resolved.conf&lt;br /&gt;
* disable NetworkManager&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
== U-22, U-24 ifup-ko ==&lt;br /&gt;
&lt;br /&gt;
Network configuration of modern linux is confused. There are at least 3 configuration methods, each with different shortcomings:&lt;br /&gt;
* the old ifup method is barely documented&lt;br /&gt;
* NetworkManager is well documented and tooled, but sometimes does strange things&lt;br /&gt;
* systemd-networkd is mysterious, and likely to do strange stuff, like all systemd stuff&lt;br /&gt;
* netplan is the latest method, configuration is simple but uses NetworkManager or systemd-networkd as backend.&lt;br /&gt;
&lt;br /&gt;
This is a solution for a specific situation of fixed computer with one fixed wired interface and maybe one or more additional interfaces for fixed wired private networks.&lt;br /&gt;
&lt;br /&gt;
Install /etc/ifup-ko, edit it with IP addresses of main and additional interfaces, let systemd run it in the right place in the boot sequence replacing NetworkManager and NetworkManager-wait-online .&lt;br /&gt;
&lt;br /&gt;
As bonus, /etc/ifup-ko waits up to 10 seconds for the main interface link to come up. If this is not needed, comment it out from the script.&lt;br /&gt;
&lt;br /&gt;
* prepare&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
cd ifup-ko&lt;br /&gt;
make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* confirm interface names&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately or after 10 seconds&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe list of interfaces is correct, name of main interface is correct&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/ifup-ko&lt;br /&gt;
** add host IP address to the &amp;quot;ifconfig&amp;quot; line&lt;br /&gt;
** add gateway IP address to the &amp;quot;ip route add&amp;quot; line&lt;br /&gt;
* test&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl start ifup-ko ### should finish immediately&lt;br /&gt;
systemctl status ifup-ko -n 1000 ### observe everything is configured as expected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cut-over&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable networkd-dispatcher&lt;br /&gt;
systemctl disable NetworkManager&lt;br /&gt;
systemctl disable wpa_supplicant # if no Wifi or Wifi not in use&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* reboot&lt;br /&gt;
&lt;br /&gt;
= Disable systemd-networkd =&lt;br /&gt;
&lt;br /&gt;
On netbooted machines, systemd-networkd should be disabled - when &amp;quot;apt upgrade&amp;quot; runs&lt;br /&gt;
and needs to update and configure systemd, it will stop systemd-networkd, which&lt;br /&gt;
will stop the network, which will stop the NFS mounted root filesystem, which will stop&lt;br /&gt;
the machine.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable systemd-networkd.service&lt;br /&gt;
systemctl disable systemd-networkd.socket&lt;br /&gt;
systemctl mask systemd-networkd.service&lt;br /&gt;
systemctl mask systemd-networkd.socket&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Configure ECC memory =&lt;br /&gt;
&lt;br /&gt;
== Configure EDAC ==&lt;br /&gt;
&lt;br /&gt;
* apt install edac-utils rasdaemon&lt;br /&gt;
&lt;br /&gt;
=== Intel i3-2120 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@musr00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X9SCL/X9SCM&lt;br /&gt;
root@musr00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E-2236 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SCM-F&lt;br /&gt;
root@daq00:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq00:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq00:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check edac sysfs files (Intel)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:10 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Jan 25 15:10 rank7&lt;br /&gt;
--w------- 1 root root 4096 Jan 25 15:10 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Jan 25 15:10 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 25 15:10 uevent&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1270 v6 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
root@wheel-SYS-5019S-M:~/git/scripts# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@grsnis01:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@grsnis01:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@grsnis01:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Feb 19 12:35 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Feb 19 12:35 rank7&lt;br /&gt;
--w------- 1 root root 4096 Feb 19 12:35 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 19 12:35 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 19 12:35 uevent&lt;br /&gt;
root@grsnis01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Intel E3-1245 v6 ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
[root@alphagdaq ~]# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
[root@alphagdaq ~]# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------------------------------+&lt;br /&gt;
          |                      mc0                      |&lt;br /&gt;
          |  csrow0   |  csrow1   |  csrow2   |  csrow3   |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------------------------------+&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#3channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#3channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SSH-F&lt;br /&gt;
[root@alphagdaq ~]# ras-mc-ctl --summary&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: mc_event at /usr/sbin/ras-mc-ctl line 1129.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1130.&lt;br /&gt;
[root@alphagdaq ~]# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3700X ===&lt;br /&gt;
&lt;br /&gt;
(memory is non-ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# &lt;br /&gt;
root@daq13:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers not loaded.&lt;br /&gt;
root@daq13:~# edac-util &lt;br /&gt;
edac-util: Error: No memory controller data found.&lt;br /&gt;
root@daq13:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers loaded. No memory controllers found&lt;br /&gt;
root@daq13:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Jan 25 15:26 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Jan 21 16:16 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Jan 21 16:16 uevent&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(memory is ECC)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@trinatdaq:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-E GAMING&lt;br /&gt;
root@trinatdaq:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@trinatdaq:~# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@trinatdaq:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Dec 15 13:04 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 Dec 13 18:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 13 18:31 uevent&lt;br /&gt;
root@trinatdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dec 15 13:04 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dec 15 13:04 rank7&lt;br /&gt;
--w------- 1 root root 4096 Dec 15 13:04 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Dec 15 13:04 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Dec 15 13:04 uevent&lt;br /&gt;
root@trinatdaq:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 5000G ===&lt;br /&gt;
&lt;br /&gt;
* no linux driver for AMD 5000-series &amp;quot;G&amp;quot; CPU&lt;br /&gt;
* no mention of ECC in the BIOS settings&lt;br /&gt;
* unclear status of ECC support in AMD documentation (sais only &amp;quot;pro&amp;quot; &amp;quot;G&amp;quot; CPUs have ECC)&lt;br /&gt;
* unclear status of ECC support in ASUS documentation (web page out of date)&lt;br /&gt;
&lt;br /&gt;
=== AMD 5600X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. ROG STRIX B550-XE GAMING WIFI&lt;br /&gt;
root@daq17:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@daq17:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@daq17:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 7 root root    0 Aug 19 19:27 mc0&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
lrwxrwxrwx 1 root root    0 May 10 10:11 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 10 10:11 uevent&lt;br /&gt;
root@daq17:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Aug 19 19:27 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Aug 19 19:27 rank7&lt;br /&gt;
--w------- 1 root root 4096 Aug 19 19:27 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Aug 19 19:27 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Aug 19 19:27 uevent&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 3955WX ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: ASUSTeK COMPUTER INC. Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util &lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# ls -l /sys/devices/system/edac/mc&lt;br /&gt;
total 0&lt;br /&gt;
drwxr-xr-x 19 root root    0 Dez 12 04:48 mc0&lt;br /&gt;
drwxr-xr-x  2 root root    0 Dez 12 04:48 power&lt;br /&gt;
lrwxrwxrwx  1 root root    0 Dez  9 05:31 subsystem -&amp;gt; ../../../../bus/edac&lt;br /&gt;
-rw-r--r--  1 root root 4096 Dez  9 05:31 uevent&lt;br /&gt;
root@alphasuperdaq:~/git/scripts/quotareport# &lt;br /&gt;
root@alphasuperdaq:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 Dez 12 04:48 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank0&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank1&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank10&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank11&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank12&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank13&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank14&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank15&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank2&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank3&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank5&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank6&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank7&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank8&lt;br /&gt;
drwxr-xr-x 3 root root    0 Dez 12 04:48 rank9&lt;br /&gt;
--w------- 1 root root 4096 Feb 28 22:19 reset_counters&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 sdram_scrub_rate&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 Feb 28 22:19 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 Feb 28 22:19 uevent&lt;br /&gt;
root@alphasuperdaq:~# &lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 868.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 869.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 872.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 791.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                                                                              mc0                                                                                              |&lt;br /&gt;
    |                                            csrow0                                             |                                            csrow1                                             |&lt;br /&gt;
    | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  | channel0  | channel1  | channel2  | channel3  | channel4  | channel5  | channel6  | channel7  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#0channel#2	0	0&lt;br /&gt;
mc#0csrow#1channel#7	0	0&lt;br /&gt;
mc#0csrow#0channel#3	0	0&lt;br /&gt;
mc#0csrow#1channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#2	0	0&lt;br /&gt;
mc#0csrow#0channel#7	0	0&lt;br /&gt;
mc#0csrow#1channel#3	0	0&lt;br /&gt;
mc#0csrow#0channel#4	0	0&lt;br /&gt;
mc#0csrow#1channel#1	0	0&lt;br /&gt;
mc#0csrow#1channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#6	0	0&lt;br /&gt;
mc#0csrow#0channel#1	0	0&lt;br /&gt;
mc#0csrow#0channel#5	0	0&lt;br /&gt;
mc#0csrow#0channel#0	0	0&lt;br /&gt;
mc#0csrow#1channel#6	0	0&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: ASUSTeK COMPUTER INC. model Pro WS WRX80E-SAGE SE WIFI&lt;br /&gt;
root@alphasuperdaq:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@alphasuperdaq:~#&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== AMD 7700X ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# apt install edac-utils&lt;br /&gt;
root@dsfe05:~# edac-ctl --mainboard&lt;br /&gt;
edac-ctl: mainboard: Supermicro H13SAE-MF&lt;br /&gt;
root@dsfe05:~# edac-ctl --status&lt;br /&gt;
edac-ctl: drivers are loaded.&lt;br /&gt;
root@dsfe05:~# edac-util&lt;br /&gt;
edac-util: No errors to report.&lt;br /&gt;
root@dsfe05:~# edac-util -s&lt;br /&gt;
edac-util: EDAC drivers are loaded. 1 MC detected&lt;br /&gt;
root@dsfe05:~# ls -l /sys/devices/system/edac/mc/mc0&lt;br /&gt;
total 0&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ce_noinfo_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 max_location&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 mc_name&lt;br /&gt;
drwxr-xr-x 2 root root    0 May 14 09:33 power&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank4&lt;br /&gt;
drwxr-xr-x 3 root root    0 May 14 09:33 rank5&lt;br /&gt;
--w------- 1 root root 4096 May 14 09:33 reset_counters&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 seconds_since_reset&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 size_mb&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_count&lt;br /&gt;
-r--r--r-- 1 root root 4096 May 14 09:33 ue_noinfo_count&lt;br /&gt;
-rw-r--r-- 1 root root 4096 May 14 09:33 uevent&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Configure rasdaemon ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable rasdaemon&lt;br /&gt;
systemctl restart rasdaemon&lt;br /&gt;
systemctl status rasdaemon&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Mon 2021-01-25 15:16:37 PST; 3min 5s ago&lt;br /&gt;
   Main PID: 2477175 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 76958)&lt;br /&gt;
     Memory: 17.1M&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─2477175 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: ras:extlog_mem_event event enabled&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Listening to events for cpus 0 to 11&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: Enabled event ras:extlog_mem_event&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mc_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording aer_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording extlog_event events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording mce_record events&lt;br /&gt;
Jan 25 15:16:37 daq00.triumf.ca rasdaemon[2477175]: rasdaemon: Recording arm_event events&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get reports ==&lt;br /&gt;
&lt;br /&gt;
* Intel 2x32GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-------------------------+&lt;br /&gt;
          |           mc0           |&lt;br /&gt;
          |   csrow0   |   csrow1   |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
channel1: |  16384 MB  |  16384 MB  |&lt;br /&gt;
channel0: |  16384 MB  |  16384 MB  |&lt;br /&gt;
----------+-------------------------+&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Intel 4x16GB ECC DIMMs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# ras-mc-ctl --error-count&lt;br /&gt;
Label                   CE      UE&lt;br /&gt;
mc#0csrow#0channel#1    0       0&lt;br /&gt;
mc#0csrow#2channel#0    0       0&lt;br /&gt;
mc#0csrow#0channel#0    0       0&lt;br /&gt;
mc#0csrow#2channel#1    0       0&lt;br /&gt;
mc#0csrow#1channel#0    0       0&lt;br /&gt;
mc#0csrow#1channel#1    0       0&lt;br /&gt;
mc#0csrow#3channel#0    0       0&lt;br /&gt;
mc#0csrow#3channel#1    0       0&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --layout&lt;br /&gt;
          +-----------------------+&lt;br /&gt;
          |          mc0          |&lt;br /&gt;
          |  csrow0   |  csrow1   |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
channel1: |  8192 MB  |  8192 MB  |&lt;br /&gt;
channel0: |  8192 MB  |  8192 MB  |&lt;br /&gt;
----------+-----------------------+&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# &lt;br /&gt;
root@daq00:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model X11SCM-F&lt;br /&gt;
root@daq00:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
DBD::SQLite::db prepare failed: no such table: devlink_event at /usr/sbin/ras-mc-ctl line 1181.&lt;br /&gt;
Can&#039;t call method &amp;quot;execute&amp;quot; on an undefined value at /usr/sbin/ras-mc-ctl line 1182.&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
note: ubuntu LTS 22.04 DBD::SQLite::db error is not there.&lt;br /&gt;
&lt;br /&gt;
* AMD 7700 2x32GB DDR5 ECC DIMMs&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsfe05:~# systemctl status rasdaemon&lt;br /&gt;
● rasdaemon.service - RAS daemon to log the RAS events&lt;br /&gt;
     Loaded: loaded (/lib/systemd/system/rasdaemon.service; enabled; vendor preset: enabled)&lt;br /&gt;
     Active: active (running) since Tue 2024-05-14 09:36:43 PDT; 33ms ago&lt;br /&gt;
    Process: 4088418 ExecStartPost=/usr/sbin/rasdaemon --enable (code=exited, status=0/SUCCESS)&lt;br /&gt;
   Main PID: 4088417 (rasdaemon)&lt;br /&gt;
      Tasks: 1 (limit: 37300)&lt;br /&gt;
     Memory: 788.0K&lt;br /&gt;
        CPU: 5ms&lt;br /&gt;
     CGroup: /system.slice/rasdaemon.service&lt;br /&gt;
             └─4088417 /usr/sbin/rasdaemon -f -r&lt;br /&gt;
&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:aer_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:aer_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: mce:mce_record event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event mce:mce_record&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: ras:extlog_mem_event event enabled&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: Enabled event ras:extlog_mem_event&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mc_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording aer_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording extlog_event events&lt;br /&gt;
May 14 09:36:43 dsfe05 rasdaemon[4088417]: rasdaemon: Recording mce_record events&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --layout&lt;br /&gt;
Use of uninitialized value $max_pos[3] in modulus (%) at /usr/sbin/ras-mc-ctl line 907.&lt;br /&gt;
Use of uninitialized value $d in numeric ge (&amp;gt;=) at /usr/sbin/ras-mc-ctl line 908.&lt;br /&gt;
Use of uninitialized value $d in sprintf at /usr/sbin/ras-mc-ctl line 911.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
Use of uninitialized value $pos[3] in join or string at /usr/sbin/ras-mc-ctl line 830.&lt;br /&gt;
    +-----------------------------------------------------------------------------------------------+&lt;br /&gt;
    |                                              mc0                                              |&lt;br /&gt;
    |        csrow0         |        csrow1         |        csrow2         |        csrow3         |&lt;br /&gt;
    | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  | channel0  | channel1  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
&lt;br /&gt;
0: |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |     0 MB  |&lt;br /&gt;
----+-----------------------------------------------------------------------------------------------+&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --error-count&lt;br /&gt;
Label               	CE	UE&lt;br /&gt;
mc#0csrow#2channel#1	0	0&lt;br /&gt;
mc#0csrow#2channel#0	0	0&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --print-labels&lt;br /&gt;
ras-mc-ctl: Error: No dimm labels for Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --mainboard&lt;br /&gt;
ras-mc-ctl: mainboard: Supermicro model H13SAE-MF&lt;br /&gt;
root@dsfe05:~# ras-mc-ctl --summary&lt;br /&gt;
No Memory errors.&lt;br /&gt;
&lt;br /&gt;
No PCIe AER errors.&lt;br /&gt;
&lt;br /&gt;
No Extlog errors.&lt;br /&gt;
&lt;br /&gt;
No MCE errors.&lt;br /&gt;
root@dsfe05:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= sensors =&lt;br /&gt;
&lt;br /&gt;
== VME CPU V7865 ==&lt;br /&gt;
&lt;br /&gt;
add to /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
modprobe coretemp&lt;br /&gt;
modprobe lm75&lt;br /&gt;
modprobe lm90&lt;br /&gt;
modprobe max1668&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
available sensors:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@lxdaq23:~# sensors&lt;br /&gt;
max6657-i2c-0-4c&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +29.1°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
temp2:        +31.5°C  (low  = -55.0°C, high = +105.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst = +95.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
Core 1:       +25.0°C  (crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
max1805-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +35.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp2:        +63.0°C  (low  = -55.0°C, high = +127.0°C)&lt;br /&gt;
temp3:          FAULT  (low  = -55.0°C, high = +127.0°C)  ALARM (HIGH)&lt;br /&gt;
&lt;br /&gt;
lm75-i2c-0-48&lt;br /&gt;
Adapter: SMBus I801 adapter at 0400&lt;br /&gt;
temp1:        +34.5°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
&lt;br /&gt;
root@lxdaq23:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P7P55D EVO ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2101&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Core 0:       +34.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 1:       +37.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 2:       +38.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
Core 3:       +35.0°C  (high = +83.0°C, crit = +99.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0100&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.05 V)&lt;br /&gt;
temp1:        +46.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
atk0110-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
Vcore Voltage:      864.00 mV (min =  +0.80 V, max =  +1.60 V)&lt;br /&gt;
+3.3V Voltage:        3.38 V  (min =  +2.97 V, max =  +3.63 V)&lt;br /&gt;
+5V Voltage:          5.04 V  (min =  +4.50 V, max =  +5.50 V)&lt;br /&gt;
+12V Voltage:        12.15 V  (min = +10.20 V, max = +13.80 V)&lt;br /&gt;
CPU Fan Speed:       968 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis1 Fan Speed: 1288 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Chassis2 Fan Speed: 1316 RPM  (min =  600 RPM, max = 7200 RPM)&lt;br /&gt;
Power Fan Speed:       0 RPM  (min =    0 RPM, max = 7200 RPM)&lt;br /&gt;
CPU Temperature:     +34.0°C  (high = +45.0°C, crit = +45.5°C)&lt;br /&gt;
MB Temperature:      +30.0°C  (high = +45.0°C, crit = +46.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z97-WS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 2704&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /boot/grub/grub.cfg, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@isdaq08:~# sensors&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
temp2:        +29.8°C  &lt;br /&gt;
&lt;br /&gt;
nct6791-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:                 888.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:                    3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:                   3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                     1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                     1.99 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                     0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
3VSB:                    3.44 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:                    3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                     1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in11:                  840.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in13:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                    0.00 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                  1041 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                  1040 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                     0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                 +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:                 +41.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:               -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                +35.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:               +127.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:           +41.0°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:           +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:            +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:            +0.0°C  &lt;br /&gt;
PCH_DIM0_TEMP:           +0.0°C  &lt;br /&gt;
intrusion0:            ALARM&lt;br /&gt;
intrusion1:            ALARM&lt;br /&gt;
beep_enable:           disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +42.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +40.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +39.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@isdaq08:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z170-DELUXE ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 3801&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe lm92 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* in /etc/default/grub, add: GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;acpi_enforce_resources=no&amp;quot;&lt;br /&gt;
* update grub and reboot: grub-mkconfig -o /boot/grub/grub.cfg&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@iris00:~# sensors&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      600.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      144.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                        0.00 V  (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in7:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     600.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     592.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     968.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1370 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1437 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +42.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                  -128.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +50.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +28.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +50.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +42.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1a&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-18&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +34.8°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-1b&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +35.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-0-19&lt;br /&gt;
Adapter: SMBus I801 adapter at f040&lt;br /&gt;
temp1:        +36.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +52.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +48.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +47.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
root@iris00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS Z390M-PRO GAMING (WI-FI) ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 3006&lt;br /&gt;
* load sensors drivers&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq18:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      696.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)&lt;br /&gt;
in6:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.42 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.17 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.07 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1131 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                     1006 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +32.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +25.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN1:                    +7.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN2:                    +8.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +24.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN4:                   +83.0°C  (high = +80.0°C, hyst = +75.0°C)  ALARM&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +29.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:               +0.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +39.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +33.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 4:        +31.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 5:        +30.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
root@daq18:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS H110M-A/M.2 ==&lt;br /&gt;
&lt;br /&gt;
* BIOS version 4202&lt;br /&gt;
* echo modprobe coretemp &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midpol:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +33.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +30.0°C  (high = +80.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
acpitz-acpi-0&lt;br /&gt;
Adapter: ACPI interface&lt;br /&gt;
temp1:        +27.8°C  (crit = +119.0°C)&lt;br /&gt;
temp2:        +29.8°C  (crit = +119.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6793-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      368.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      928.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.14 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                      1000.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     152.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     128.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     120.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     136.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                     1004 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1143 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan6:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                   +118.0°C  (high = +98.0°C, hyst = +95.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +29.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +30.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                  +112.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                  +111.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                  +110.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0:              +31.0°C  (high = +98.0°C, hyst = +95.0°C)&lt;br /&gt;
                                    (crit = +100.0°C)&lt;br /&gt;
PECI Agent 0 Calibration:  +36.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
TSI2_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI3_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI4_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI5_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI6_TEMP:                +3892314.0°C  &lt;br /&gt;
TSI7_TEMP:                +3892314.0°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
root@midpol:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS P9X79 WS ==&lt;br /&gt;
&lt;br /&gt;
* https://www.asus.com/supportonly/P9X79%20WS/HelpDesk_Manual/&lt;br /&gt;
* BIOS version 4802&lt;br /&gt;
* modprobe nct6775&lt;br /&gt;
* modprobe coretemp&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq14:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +29.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +24.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +35.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +82.0°C, crit = +100.0°C)&lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0200&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +39.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6776-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Vcore:           1.04 V  (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
AVCC:            3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
+3.3V:           3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:             1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:             2.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:           904.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
3VSB:            3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
Vbat:            3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:          1265 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:          1909 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:             0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:             0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:         +34.0°C  (high =  +0.0°C, hyst =  +0.0°C)  ALARM  sensor = thermistor&lt;br /&gt;
CPUTIN:         +58.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermal diode&lt;br /&gt;
AUXTIN:         +31.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
PECI Agent 0:   +31.0°C  (high = +80.0°C, hyst = +75.0°C)&lt;br /&gt;
                         (crit = +96.0°C)&lt;br /&gt;
PCH_CHIP_TEMP:   +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:    +0.0°C  &lt;br /&gt;
PCH_MCH_TEMP:    +0.0°C  &lt;br /&gt;
intrusion0:    ALARM&lt;br /&gt;
intrusion1:    ALARM&lt;br /&gt;
beep_enable:   disabled&lt;br /&gt;
&lt;br /&gt;
root@daq14:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS TUF GAMING B550M-PLUS WIFI II ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2803, 2806&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@midm9a:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      488.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.33 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.82 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                       1.01 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      760 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                     1264 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +22.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +95.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +25.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +25.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +23.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +32.4°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       993.00 mV &lt;br /&gt;
edge:         +28.0°C  &lt;br /&gt;
PPT:          20.00 W  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.4°C  &lt;br /&gt;
&lt;br /&gt;
root@midm9a:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-XE GAMING WIFI ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 2423, 2604&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq13:~# sensors&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      344.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                      992.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                      960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      216.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.41 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.30 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.81 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                     960.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.03 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      845 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      998 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +28.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +27.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +94.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +28.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +97.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +27.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +33.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
amdgpu-pci-0600&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:        1.45 V  &lt;br /&gt;
vddnb:       999.00 mV &lt;br /&gt;
edge:         +29.0°C  &lt;br /&gt;
PPT:          14.00 W  &lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +30.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +33.9°C  &lt;br /&gt;
&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS ASUS ROG STRIX B550-E GAMING ==&lt;br /&gt;
&lt;br /&gt;
* bios 2803&lt;br /&gt;
* echo modprobe jc42 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq17:~# sensors&lt;br /&gt;
jc42-i2c-1-1b&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +25.0°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
iwlwifi_1-virtual-0&lt;br /&gt;
Adapter: Virtual device&lt;br /&gt;
temp1:        +28.0°C  &lt;br /&gt;
&lt;br /&gt;
nouveau-pci-0800&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
GPU core:    900.00 mV (min =  +0.85 V, max =  +1.00 V)&lt;br /&gt;
temp1:        +34.0°C  (high = +95.0°C, hyst =  +3.0°C)&lt;br /&gt;
                       (crit = +105.0°C, hyst =  +5.0°C)&lt;br /&gt;
                       (emerg = +135.0°C, hyst =  +5.0°C)&lt;br /&gt;
&lt;br /&gt;
nct6798-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      288.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      224.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.36 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.31 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        1.79 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.06 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     280.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     208.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                      843 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                      629 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                      746 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +22.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +25.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +93.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +22.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +96.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +25.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +27.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               ALARM&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
jc42-i2c-1-1a&lt;br /&gt;
Adapter: SMBus PIIX4 adapter port 0 at 0b00&lt;br /&gt;
temp1:        +23.2°C  (low  =  +0.0°C)                  ALARM (HIGH, CRIT)&lt;br /&gt;
                       (high =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
                       (crit =  +0.0°C, hyst =  +0.0°C)&lt;br /&gt;
&lt;br /&gt;
asusec-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
CPU_Opt:        0 RPM&lt;br /&gt;
Chipset:      +34.0°C  &lt;br /&gt;
CPU:          +25.0°C  &lt;br /&gt;
Motherboard:  +22.0°C  &lt;br /&gt;
T_Sensor:     -40.0°C  &lt;br /&gt;
VRM:          +31.0°C  &lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +28.0°C  &lt;br /&gt;
Tccd1:        +27.5°C  &lt;br /&gt;
&lt;br /&gt;
root@daq17:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ASUS PRIME B650-PLUS ==&lt;br /&gt;
&lt;br /&gt;
* BIOS 1811&lt;br /&gt;
* echo modprobe nct6775 &amp;gt;&amp;gt; /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@dsdaqgw:~# sensors&lt;br /&gt;
amdgpu-pci-0b00&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
vddgfx:      930.00 mV &lt;br /&gt;
vddnb:         1.19 V  &lt;br /&gt;
edge:         +38.0°C  &lt;br /&gt;
PPT:          25.10 W  &lt;br /&gt;
&lt;br /&gt;
nct6799-isa-0290&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
in0:                      920.00 mV (min =  +0.00 V, max =  +1.74 V)&lt;br /&gt;
in1:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in2:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in3:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in4:                        1.02 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in5:                        1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in6:                      320.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in7:                        3.39 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in8:                        3.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in9:                        3.38 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in10:                       1.28 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in11:                       1.10 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in12:                       1.04 V  (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in13:                     416.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
in14:                     328.00 mV (min =  +0.00 V, max =  +0.00 V)  ALARM&lt;br /&gt;
fan1:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan2:                     1253 RPM  (min =    0 RPM)&lt;br /&gt;
fan3:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan4:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan5:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
fan7:                        0 RPM  (min =    0 RPM)&lt;br /&gt;
SYSTIN:                    +33.0°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
CPUTIN:                    +35.5°C  (high = +80.0°C, hyst = +75.0°C)  sensor = thermistor&lt;br /&gt;
AUXTIN0:                   +78.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN1:                   +11.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN2:                   +20.0°C    sensor = thermistor&lt;br /&gt;
AUXTIN3:                   +82.0°C    sensor = thermistor&lt;br /&gt;
PECI Agent 0 Calibration:  +35.5°C  &lt;br /&gt;
PCH_CHIP_CPU_MAX_TEMP:      +0.0°C  &lt;br /&gt;
PCH_CHIP_TEMP:              +0.0°C  &lt;br /&gt;
PCH_CPU_TEMP:               +0.0°C  &lt;br /&gt;
TSI0_TEMP:                 +42.6°C  &lt;br /&gt;
intrusion0:               ALARM&lt;br /&gt;
intrusion1:               OK&lt;br /&gt;
beep_enable:              disabled&lt;br /&gt;
&lt;br /&gt;
k10temp-pci-00c3&lt;br /&gt;
Adapter: PCI adapter&lt;br /&gt;
Tctl:         +42.6°C  &lt;br /&gt;
Tccd1:        +36.4°C  &lt;br /&gt;
&lt;br /&gt;
root@dsdaqgw:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Enable CPU turbo mode =&lt;br /&gt;
&lt;br /&gt;
* Intel CPU has a nominal CPU frequency (i.e. 3.4GHz) and a turbo-boost CPU frequency (i.e. 4.0GHz). Here we will enable this turbo-boost mode.&lt;br /&gt;
* Find out CPU capability&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# lscpu | grep Hz&lt;br /&gt;
Model name:                      Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz&lt;br /&gt;
CPU MHz:                         3965.803&lt;br /&gt;
CPU max MHz:                     4000.0000&lt;br /&gt;
CPU min MHz:                     800.0000&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Look up this CPU in the Intel ARK database - google for the CPU model name, i.e.&lt;br /&gt;
https://ark.intel.com/content/www/us/en/ark/products/88196/intel-core-i7-6700-processor-8m-cache-up-to-4-00-ghz.html&lt;br /&gt;
* Find current frequency settings:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;powersave&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 2.72 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* Note the following:&lt;br /&gt;
** current governor is &amp;quot;powersave&amp;quot;&lt;br /&gt;
** &amp;quot;performance&amp;quot; governor is available&lt;br /&gt;
** &amp;quot;boost state support&amp;quot; is supported and active.&lt;br /&gt;
* Confirm CPU frequency governor:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
powersave&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt; &lt;br /&gt;
* Change governor to &amp;quot;performance&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower frequency-set --governor performance&lt;br /&gt;
Setting cpu: 0&lt;br /&gt;
Setting cpu: 1&lt;br /&gt;
Setting cpu: 2&lt;br /&gt;
Setting cpu: 3&lt;br /&gt;
Setting cpu: 4&lt;br /&gt;
Setting cpu: 5&lt;br /&gt;
Setting cpu: 6&lt;br /&gt;
Setting cpu: 7&lt;br /&gt;
root@daq01:~# cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
performance&lt;br /&gt;
root@daq01:~# cpupower frequency-info&lt;br /&gt;
analyzing CPU 0:&lt;br /&gt;
  driver: intel_pstate&lt;br /&gt;
  CPUs which run at the same hardware frequency: 0&lt;br /&gt;
  CPUs which need to have their frequency coordinated by software: 0&lt;br /&gt;
  maximum transition latency:  Cannot determine or is not supported.&lt;br /&gt;
  hardware limits: 800 MHz - 4.00 GHz&lt;br /&gt;
  available cpufreq governors: performance powersave&lt;br /&gt;
  current policy: frequency should be within 800 MHz and 4.00 GHz.&lt;br /&gt;
                  The governor &amp;quot;performance&amp;quot; may decide which speed to use&lt;br /&gt;
                  within this range.&lt;br /&gt;
  current CPU frequency: Unable to call hardware&lt;br /&gt;
  current CPU frequency: 3.93 GHz (asserted by call to kernel)&lt;br /&gt;
  boost state support:&lt;br /&gt;
    Supported: yes&lt;br /&gt;
    Active: yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* monitor CPU frequency:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# cpupower monitor&lt;br /&gt;
    | Nehalem                   || Mperf              || Idle_Stats                                     &lt;br /&gt;
 CPU| C3   | C6   | PC3  | PC6   || C0   | Cx   | Freq  || POLL | C1   | C1E  | C3   | C6   | C7s  | C8    &lt;br /&gt;
   0|  0.00|  0.00|  0.00|  0.00|| 88.80| 11.20|  3973||  0.00|  0.00|  0.01|  0.02|  0.31|  0.00|  4.25&lt;br /&gt;
   4|  0.00|  0.00|  0.00|  0.00||  4.70| 95.30|  3945||  0.00|  0.00|  0.00|  0.00|  0.00|  0.00| 95.03&lt;br /&gt;
   1|  0.73|  3.70|  0.00|  0.00||  4.52| 95.48|  3864||  0.00|  0.01|  1.19|  0.44|  2.82|  0.00| 90.23&lt;br /&gt;
   5|  0.73|  3.70|  0.00|  0.00||  0.37| 99.63|  3807||  0.00|  0.00|  0.03|  0.09|  1.70|  0.00| 97.64&lt;br /&gt;
   2|  2.28| 12.86|  0.00|  0.00||  1.41| 98.59|  3829||  0.00|  0.86|  3.17|  0.46|  7.70|  0.00| 85.87&lt;br /&gt;
   6|  2.28| 12.86|  0.00|  0.00||  2.88| 97.12|  3856||  0.00|  0.11|  4.56|  2.15| 10.31|  0.00| 78.99&lt;br /&gt;
   3|  1.33|  4.81|  0.00|  0.00||  0.99| 99.01|  3804||  0.00|  0.49|  0.79|  0.01|  1.03|  0.00| 96.12&lt;br /&gt;
   7|  1.34|  4.81|  0.00|  0.00||  1.26| 98.74|  3818||  0.00|  0.01|  2.32|  0.47|  5.02|  0.00| 90.06&lt;br /&gt;
root@daq01:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that the CPU is not overheating:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq01:~# sensors&lt;br /&gt;
coretemp-isa-0000&lt;br /&gt;
Adapter: ISA adapter&lt;br /&gt;
Package id 0:  +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 0:        +51.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 1:        +38.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 2:        +34.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
Core 3:        +32.0°C  (high = +84.0°C, crit = +100.0°C)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* congratulations, we are running at 4 GHz now!&lt;br /&gt;
&lt;br /&gt;
= Setup ubuntu as gateway to private network =&lt;br /&gt;
&lt;br /&gt;
See also:&lt;br /&gt;
* https://daq.triumf.ca/DaqWiki/index.php/VME-CPU#Setup_the_boot_host_computer_.28el7.29&lt;br /&gt;
* http://www.triumf.info/wiki/DAQwiki/index.php/Dhcpd_on_eth1&lt;br /&gt;
&lt;br /&gt;
== Steps to do ==&lt;br /&gt;
&lt;br /&gt;
!!! UPDATED 16feb2024 Ubuntu-22.04.03 !!!&lt;br /&gt;
&lt;br /&gt;
* assign network numbers to the private network, i.e. 192.168.1.x, 192.168.2.x, etc&lt;br /&gt;
* (on the gateway machine, each private network interface has to have a different network number)&lt;br /&gt;
* (each network interface can have multiple networks attached, via VLANs or via eth0:0, eth0:1 constructs)&lt;br /&gt;
* assign IP addresses on the private network, save them in /etc/hosts i.e. &amp;quot;hvps 192.168.1.10&amp;quot;&lt;br /&gt;
* (for simplicity, assign 192.168.1.1 to the gateway machine itself)&lt;br /&gt;
* (IP addresses 192.168.1.0 and 192.168.1.255 are &amp;quot;special&amp;quot;, do not use them)&lt;br /&gt;
* setup DNS server (dnsmasq) to serve contents of /etc/hosts via DNS (otherwise, many programs will see inconsistent name to IP address mapping)&lt;br /&gt;
* setup DHCP server (dnsmasq) to give out the IP addresses&lt;br /&gt;
* setup TFTP server (dnsmasq), pxelinux and NFS for diskless booting&lt;br /&gt;
* setup time server (chronyd) to provide common time to all devices&lt;br /&gt;
* setup NAT so machines on private network can access the internet (to get OS updates, etc)&lt;br /&gt;
* setup NIS and NFS so machines on the private network can use common home directories&lt;br /&gt;
* setup rsync backup of machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup hosts ==&lt;br /&gt;
&lt;br /&gt;
* edit /etc/hosts&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.101 dsfe01&lt;br /&gt;
... and so forth&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup dns and dhcp ==&lt;br /&gt;
&lt;br /&gt;
!!! updated 16feb2024 for Ubuntu 22.04.3 !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: stock systemd-resolved remains, is configured to forward queries to dnsmasq, configured to forward queries to TRIUMF DNS !!!&lt;br /&gt;
&lt;br /&gt;
!!! note: per authors of systemd, bare hostnames are not permitted, a DNS domain name must always be used. DNS domain name &amp;quot;dsdaq&amp;quot; is used in this example !!!&lt;br /&gt;
&lt;br /&gt;
* apt install dnsmasq&lt;br /&gt;
* ensure dnsmasq starts after all interfaces are up (Ubuntu-22)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /etc/systemd/system/dnsmasq.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/dnsmasq.service.d/local.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit /etc/dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/dnsmasq.conf&lt;br /&gt;
# DNS settings &lt;br /&gt;
#port=0 # disable DNS function &lt;br /&gt;
port=53 # enable DNS function &lt;br /&gt;
bind-interfaces # do not collide with systemd-resolved, we use 127.0.0.1:53, they use 127.0.0.53:53 &lt;br /&gt;
domain-needed &lt;br /&gt;
bogus-priv &lt;br /&gt;
no-resolv &lt;br /&gt;
#log-queries # log DNS quesries &lt;br /&gt;
 &lt;br /&gt;
# TRIUMF DNS settings &lt;br /&gt;
 &lt;br /&gt;
server=142.90.100.19 &lt;br /&gt;
expand-hosts &lt;br /&gt;
domain=dsdaq &lt;br /&gt;
local=/dsdaq/ &lt;br /&gt;
localmx # do not forward MX queries to TRIUMF &lt;br /&gt;
&lt;br /&gt;
# DHCP settings &lt;br /&gt;
interface=enp1s0f0 # VX network 192.168.0.x &lt;br /&gt;
#interface=missing  # FEP and TSP network 192.168.1.x &lt;br /&gt;
interface=enp1s0f1 # controls network 192.168.2.x &lt;br /&gt;
#dhcp-range=192.168.1.50,192.168.1.150,infinite &lt;br /&gt;
dhcp-range=192.168.0.0,static &lt;br /&gt;
dhcp-range=192.168.2.0,static &lt;br /&gt;
log-dhcp # log DHCP queries &lt;br /&gt;
#quiet-dhcp &lt;br /&gt;
dhcp-ignore=tag:!known &lt;br /&gt;
#dhcp-boot=pxelinux.0 &lt;br /&gt;
 &lt;br /&gt;
dhcp-option=option:dns-server,192.168.0.248 &lt;br /&gt;
dhcp-option=option:ntp-server,192.168.0.248 &lt;br /&gt;
 &lt;br /&gt;
# TFTP settings &lt;br /&gt;
 &lt;br /&gt;
enable-tftp &lt;br /&gt;
tftp-root=/tftpboot &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* #mkdir /tftpboot ### per tftp-root (if no ZFS)&lt;br /&gt;
* zfs create -o mountpoint=/tftpboot rpool/tftpboot ### (if root is ZFS)&lt;br /&gt;
* create resolved-dsdaq.conf with main IP address of dnsmasq&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
[Resolve]&lt;br /&gt;
DNS=192.168.0.248&lt;br /&gt;
Domains=dsdaq triumf.ca&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir -p /etc/systemd/resolved.conf.d/&lt;br /&gt;
* /bin/rm -f /etc/systemd/resolved.conf.d/*.conf&lt;br /&gt;
* cp resolved-dsdaq.conf /etc/systemd/resolved.conf.d/&lt;br /&gt;
* systemctl stop systemd-resolved.service&lt;br /&gt;
* systemctl disable systemd-resolved.service&lt;br /&gt;
* systemctl enable dnsmasq&lt;br /&gt;
* systemctl restart dnsmasq&lt;br /&gt;
* try to &amp;quot;ping&amp;quot; or &amp;quot;host&amp;quot; some names from /etc/hosts, it should work&lt;br /&gt;
* try to ping daq00, daq00.triumf.ca, all should work&lt;br /&gt;
* resolved-dsdaq.conf goes into /etc/systemd/resolved.conf.d/ of all machines on the private network&lt;br /&gt;
* if not using systemd-resolved, edit /etc/resolv.conf&lt;br /&gt;
&lt;br /&gt;
== setup chronyd ==&lt;br /&gt;
&lt;br /&gt;
* enable ntp server:&lt;br /&gt;
* disable systemd-timesyncd, configure and enable chronyd per instructions above&lt;br /&gt;
* create dsdaq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# chrony config for dsdaq server&lt;br /&gt;
&lt;br /&gt;
#allow 192.168.0.0&lt;br /&gt;
#allow 192.168.1.0&lt;br /&gt;
#allow 192.168.2.0&lt;br /&gt;
allow all&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cp dsdaq.conf /etc/chrony/conf.d/&lt;br /&gt;
* systemctl restart chronyd&lt;br /&gt;
* chronyc tracking ### wait until time is synchronized (a few seconds)&lt;br /&gt;
* create dsdaq.sources # use hostname or IP address of chronyd server&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Put this file in /etc/chrony/sources.d&lt;br /&gt;
# systemctl restart chrony&lt;br /&gt;
# chronyc sources&lt;br /&gt;
# chronyc tracking&lt;br /&gt;
server dsdaqgw iburst prefer&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* dsdaq.sources goes to /etc/chrony/sources.d of all machines on the private network&lt;br /&gt;
&lt;br /&gt;
== setup diskless network booting ==&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for legacy pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* add bits in dnsmasq.conf&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dhcp-host=ac:1f:6b:9e:7f:4a,dsfe01,infinite&lt;br /&gt;
dhcp-boot=pxelinux.0&lt;br /&gt;
dhcp-option=17,&amp;quot;192.168.0.251:/nfsroot/%s,vers=3,tcp&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* setup pxelinux for Ubuntu-18&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://www.kernel.org/pub/linux/utils/boot/syslinux/4.xx/syslinux-4.03.tar.bz2&lt;br /&gt;
tar xjvf syslinux-4.03.tar.bz2&lt;br /&gt;
cd syslinux-4.03&lt;br /&gt;
cp -pv ./core/pxelinux.0 ./com32/hdt/hdt.c32 ./memdisk/memdisk ./com32/menu/menu.c32 /zssd/tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /zssd/tftpboot&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-4.20.iso.zip&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/memtest86+-5.01.iso.gz&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.alias&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/modules.pcimap&lt;br /&gt;
wget http://ladd00.triumf.ca/tftpboot/pci.ids&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mkdir pxelinux.cfg&lt;br /&gt;
* emacs -nw pxelinux.cfg/default&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSVSLICE PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label hdt&lt;br /&gt;
  kernel hdt.c32&lt;br /&gt;
&lt;br /&gt;
label memtest86+-5.01 &lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-5.01.iso.gz &lt;br /&gt;
&lt;br /&gt;
label memtest86+-4.20&lt;br /&gt;
  kernel memdisk iso initrd=memtest86+-4.20.iso.zip&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-5.3.0-26-generic&lt;br /&gt;
  menu default&lt;br /&gt;
  kernel vmlinuz-5.3.0-26-generic&lt;br /&gt;
  append initrd=initrd.img-5.3.0-26-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.1.1:/zssd/nfsroot/dsfe01 toram ip=dhcp panic=60 BOOTIF=enp1s0f0&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup pxelinux for efi pxe boot ===&lt;br /&gt;
&lt;br /&gt;
* https://c-nergy.be/blog/?p=13808&lt;br /&gt;
* add dnsmasq.conf bits. note: to use dhcp root-path, see the &amp;quot;nfsroot=auto&amp;quot; patch below and make sure to use the &amp;quot;dhcp-option-force&amp;quot; command (mkinitramfs dhcp client does not ask for root-path, we have to force-feed it).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# uefi pxe&lt;br /&gt;
&lt;br /&gt;
dhcp-boot=tag:uefipxe,uefi/syslinux.efi&lt;br /&gt;
dhcp-option-force=tag:fe01,option:root-path,192.168.0.248:/nfsroot/fe01&lt;br /&gt;
&lt;br /&gt;
# VX network 192.168.0.x&lt;br /&gt;
&lt;br /&gt;
dhcp-host=40:a6:b7:c1:d9:c5,fe01,infinite,set:uefipxe,set:fe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* apt install syslinux pxelinux syslinux-common syslinux-efi syslinux-utils&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /tftpboot/uefi&lt;br /&gt;
cp /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/ldlinux.e64 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/menu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/hdt.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libutil.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libmenu.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libcom32.c32 /tftpboot/uefi/&lt;br /&gt;
cp /usr/lib/syslinux/modules/efi64/libgpl.c32 /tftpboot/uefi/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it should bomb with &amp;quot;cannot load pxelinux.cfg/default&amp;quot;&lt;br /&gt;
* mkdir /tftpboot/uefi/pxelinux.cfg&lt;br /&gt;
* create /tftpboot/uefi/pxelinux.cfg/default, note nfsroot path is hardwired, note &amp;quot;http:&amp;quot; is used to load vmlinuz and initrd files (because tftp is super slow)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
default menu.c32&lt;br /&gt;
prompt 0&lt;br /&gt;
&lt;br /&gt;
menu title Welcome to the DSDAQGW UEFI PXE boot menu&lt;br /&gt;
&lt;br /&gt;
timeout 50&lt;br /&gt;
&lt;br /&gt;
label vmlinuz-6.5.0-17-generic&lt;br /&gt;
  kernel http://192.168.0.248:8088/uefi/vmlinuz-6.5.0-17-generic&lt;br /&gt;
  append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
# append initrd=http://192.168.0.248:8088/uefi/initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=192.168.0.248:/nfsroot/fe01 rw ip=dhcp panic=60&lt;br /&gt;
#  append initrd=initrd.img-6.5.0-17-generic boot=nfs root=/dev/nfs netboot=nfs nfsroot=auto ip=dhcp rw panic=60&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, it will bomb with &amp;quot;cannot load http://....&amp;quot;&lt;br /&gt;
* install mini_httpd on port 8088, see https://acme.com/software/mini_httpd/&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install mini-httpd&lt;br /&gt;
emacs -nw /etc/default/mini-httpd # set &amp;quot;START=1&amp;quot;&lt;br /&gt;
emacs -nw /etc/mini-httpd.conf # set &amp;quot;host=192.168.0.248&amp;quot;, &amp;quot;port=8088&amp;quot;, &amp;quot;data_dir=/tftpboot&amp;quot;&lt;br /&gt;
mkdir /etc/systemd/system/mini-httpd.service.d&lt;br /&gt;
echo -e &amp;quot;[Unit]\nAfter=network-online.target\n&amp;quot; &amp;gt; /etc/systemd/system/mini-httpd.service.d/local.conf&lt;br /&gt;
systemctl enable mini-httpd&lt;br /&gt;
systemctl restart mini-httpd&lt;br /&gt;
systemctl status mini-httpd&lt;br /&gt;
wget http://192.168.0.248:8088/uefi/syslinux.efi&lt;br /&gt;
tail -100 /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-22 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/lib/initramfs-tools/etc/dhcp/dhclient-enter-hooks.d/config&lt;br /&gt;
** add &amp;quot;echo ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                echo &amp;quot;ROOTSERVER=&#039;${new_routers%% *}&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;ROOTPATH=&#039;$new_root_path&#039;&amp;quot; &lt;br /&gt;
                echo &amp;quot;HOSTNAME=&#039;$new_host_name&#039;&amp;quot; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* fix U-24 initramfs bug for &amp;quot;nfsroot=auto&amp;quot;, otherwise, &amp;quot;nfsroot=&amp;quot; has to be different for each machine and you have to have separate pxelinux config files for each machine&lt;br /&gt;
** emacs -nw /usr/share/initramfs-tools/dhcpcd-hooks/70-net-conf&lt;br /&gt;
** add &amp;quot;ROOTPATH=...&amp;quot; if it is missing&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DNSDOMAIN=&#039;${new_domain_name-}&#039;                                                                                                                                                &lt;br /&gt;
ROOTSERVER=&#039;${new_routers-}&#039;                                                                                                                                                   &lt;br /&gt;
ROOTPATH=&#039;${new_root_path-}&#039;                                                                                                                                                   &lt;br /&gt;
filename=&#039;${new_filename-}&#039;                                                                                                                                                    &lt;br /&gt;
DHCPLEASETIME=&#039;${new_dhcp_lease_time-}&#039;                                                                                                                                        &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
** regenerate initramfs (be careful you generate it for the right kernel!)&lt;br /&gt;
** see https://bugs.launchpad.net/ubuntu/+source/initramfs-tools/+bug/2054482&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkinitramfs 6.5.0-18-generic&lt;br /&gt;
mkinitramfs 6.8.0-51-generic -o /boot/initrd.img-6.8.0-51-generic&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux kernel and initrd&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
cp /boot/initrd.img-6.5.0-18-generic /tftpboot/uefi/&lt;br /&gt;
chmod a+r /tftpboot/uefi/*&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* try to boot, should bomb with messages about &amp;quot;trying to mount root filesystem&amp;quot;&lt;br /&gt;
* tail /var/log/syslog&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:02 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 vendor class: PXEClient:Arch:00007:UNDI:003016&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 1:netmask, 2:time-offset, 3:router, 4, 5, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 6:dns-server, 12:hostname, 13:boot-file-size, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 15:domain-name, 17:root-path, 18:extension-path, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 22:max-datagram-reassembly, 23:default-ttl, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 28:broadcast, 40:nis-domain, 41:nis-server, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 42:ntp-server, 43:vendor-encap, 50:requested-address, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 51:lease-time, 54:server-identifier, 58:T1, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 59:T2, 60:vendor-class, 66:tftp-server, 67:bootfile-name, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 97:client-machine-id, 128, 129, 130, 131, &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 requested options: 132, 133, 134, 135&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 18 option: 67 bootfile-name  uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065885 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: error 8 User aborted the transfer received from 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/syslinux.efi to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:05 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 requested options: 1:netmask, 3:router, 6:dns-server&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 broadcast response&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-dhcp[3629416]: 2348065887 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/ldlinux.e64 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/01-40-a6-b7-c1-d9-c5 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006E not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8006 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A800 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A80 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A8 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0A not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C0 not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: file /tftpboot/uefi/pxelinux.cfg/C not found&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:09 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/menu.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/libutil.c32 to 192.168.0.110&lt;br /&gt;
Feb 16 20:43:10 dsdaqgw dnsmasq-tftp[3629416]: sent /tftpboot/uefi/pxelinux.cfg/default to 192.168.0.110&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPDISCOVER(enp1s0f0) 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPOFFER(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  2&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 available DHCP subnet: 192.168.0.0/255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 client provides name: dsdaqgw.triumf.ca&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPREQUEST(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 tags: uefipxe, fe01, known, enp1s0f0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 DHCPACK(enp1s0f0) 192.168.0.110 40:a6:b7:c1:d9:c5 fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 1:netmask, 28:broadcast, 2:time-offset, 3:router, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 15:domain-name, 6:dns-server, 119:domain-search, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 12:hostname, 44:netbios-ns, 47:netbios-scope, &lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 requested options: 26:mtu, 121:classless-static-route, 42:ntp-server&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 bootfile name: uefi/syslinux.efi&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 next server: 192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  1 option: 53 message-type  5&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 54 server-identifier  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 51 lease-time  infinite&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  1 netmask  255.255.255.0&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 28 broadcast  192.168.0.255&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  3 router  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  5 option: 15 domain-name  dsdaq&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 12 hostname  fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size: 27 option: 17 root-path  192.168.0.248:/nfsroot/fe01&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option: 42 ntp-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw dnsmasq-dhcp[3629416]: 3693523458 sent size:  4 option:  6 dns-server  192.168.0.248&lt;br /&gt;
Feb 16 20:44:54 dsdaqgw rpc.mountd[3350210]: authenticated mount request from 192.168.0.110:981 for /nfsroot/fe01 (/nfsroot/fe01)&lt;br /&gt;
Feb 16 20:45:07 dsdaqgw rpc.mountd[3350210]: authenticated unmount request from 192.168.0.110:859 for /nfsroot/fe01/tmp/autoDY4k5u (/nfsroot/fe01)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* tail /var/log/mini_httpd.log&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:15 -0800] &amp;quot;GET /uefi/vmlinuz-6.5.0-17-generic HTTP/1.0&amp;quot; 200 14227944 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
192.168.0.110 - - [16/Feb/2024:20:43:24 -0800] &amp;quot;GET /uefi/initrd.img-6.5.0-17-generic HTTP/1.0&amp;quot; 200 137824833 &amp;quot;&amp;quot; &amp;quot;Syslinux/6.04&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup efi http boot ===&lt;br /&gt;
&lt;br /&gt;
https://documentation.suse.com/sles/15-SP2/html/SLES-all/cha-deployment-prep-uefi-httpboot.html&lt;br /&gt;
&lt;br /&gt;
=== setup linux kernel ===&lt;br /&gt;
&lt;br /&gt;
* copy the kernel files&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot&lt;br /&gt;
rsync -av config* initrd* System.map* vmlinuz* /tftpboot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* cd /tftpboot&lt;br /&gt;
* chmod a+r *&lt;br /&gt;
&lt;br /&gt;
=== setup nfs ===&lt;br /&gt;
&lt;br /&gt;
* apt-get install nfs-kernel-server&lt;br /&gt;
* enable NFS over UDP, edit /etc/nfs.conf add &amp;quot;udp=y&amp;quot;:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
udp=y&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl restart nfs-server.service&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/exports&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/nfsroot/dsfe01 dsfe01(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* enable services&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl enable nfs-server&lt;br /&gt;
systemctl enable nfs-mountd&lt;br /&gt;
systemctl enable nfs-idmapd&lt;br /&gt;
systemctl restart nfs-server&lt;br /&gt;
systemctl restart nfs-mountd&lt;br /&gt;
systemctl restart nfs-idmapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* after editing /etc/exports, run&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
exportfs -av&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== setup userland ===&lt;br /&gt;
&lt;br /&gt;
!!! ubuntu-18 version !!!&lt;br /&gt;
&lt;br /&gt;
* zfs create rpool/nfsroot&lt;br /&gt;
* zfs set dedup=verify rpool/nfsroot ### enable deduplication to save disk space because most linux images have mostly identical files&lt;br /&gt;
* clone ubuntu&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkdir /nfsroot/dsfe01&lt;br /&gt;
cd /&lt;br /&gt;
rsync -avx . /nfsroot/dsfe01&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* edit config files:&lt;br /&gt;
* cd /nfsroot/dsfe01&lt;br /&gt;
* emacs -nw etc/hostname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/mailname ### change to dsfe01&lt;br /&gt;
* emacs -nw etc/yp.conf ### change daq00.triumf.ca to musr00.triumf.ca&lt;br /&gt;
* emacs -nw etc/defaultdomain ### change to MUSR-NIS&lt;br /&gt;
* cp -pvf ../lxcpet-SL610/etc/ssh/*key* etc/ssh/ ### preserve the ssh keys&lt;br /&gt;
* emacs -nw opt/gonodeinfo/gonodeinfo.conf ### update information&lt;br /&gt;
* emacs -nw root/.ssh/authorized_keys ### update root ssh keys&lt;br /&gt;
* emacs -nw etc/fstab ### add this&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/nfsroot/dsfe01 / nfs defaults,nolock 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw etc/chrony/chrony.conf&lt;br /&gt;
** comment-out all &amp;quot;pool&amp;quot; and &amp;quot;server&amp;quot; entries&lt;br /&gt;
** add entry &amp;quot;server 192.168.1.1 iburst&amp;quot;&lt;br /&gt;
&lt;br /&gt;
After dsfe01 is booted:&lt;br /&gt;
&lt;br /&gt;
* disable services:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl disable apache2&lt;br /&gt;
systemctl disable dnsmasq&lt;br /&gt;
systemctl disable zfs-import-cache&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To setup additional machines, clone dsfe01 instead of cloning the gateway machine&lt;br /&gt;
&lt;br /&gt;
=== Allow manpages to be viewed ===&lt;br /&gt;
&lt;br /&gt;
If &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; is mounted over NFS, &amp;lt;code&amp;gt;man&amp;lt;/code&amp;gt; will report a permission error. Fix it with:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ln -s /etc/apparmor.d/usr.bin.man /etc/apparmor.d/disable/&lt;br /&gt;
apparmor_parser -R /etc/apparmor.d/usr.bin.man&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== setup shared home directory ==&lt;br /&gt;
&lt;br /&gt;
=== on the gateway machine ===&lt;br /&gt;
* define netgroups&lt;br /&gt;
* emacs -nw /etc/netgroup&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dsfe (dsfe01,,) (dsfe02,,)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/nsswitch.conf ### edit the netgroup line to read:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
netgroup: files&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* export the home directories:&lt;br /&gt;
* emacs -nw /etc/exports ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
/zssd/home1 @dsfe(rw,no_root_squash,async,no_subtree_check)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* exportfs -rc&lt;br /&gt;
&lt;br /&gt;
=== on the frontend machine ===&lt;br /&gt;
&lt;br /&gt;
* mkdir /home&lt;br /&gt;
* emacs -nw /etc/fstab ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
192.168.1.1:/zssd/home1 /home nfs defaults 0 0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* mount -a&lt;br /&gt;
&lt;br /&gt;
== setup NAT ==&lt;br /&gt;
&lt;br /&gt;
NAT allows machines on the private network to connect to the internet: https://en.wikipedia.org/wiki/Network_address_translation&lt;br /&gt;
&lt;br /&gt;
In these examples:&lt;br /&gt;
* replace &amp;quot;eno1&amp;quot; with name of the outgoing interface (the one connected to the TRIUMF network).&lt;br /&gt;
* replace &amp;quot;enp11s0&amp;quot; with name of the private network interface (192.168.1.x network)&lt;br /&gt;
&lt;br /&gt;
* emacs -nw /etc/rc.local ### add this:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# /etc/rc.local&lt;br /&gt;
&lt;br /&gt;
# enable NAT&lt;br /&gt;
&lt;br /&gt;
/sbin/iptables -t nat -A POSTROUTING -o eno1 -j MASQUERADE&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
# uncomment following lines if machine has prohibitive FORWARD rules:&lt;br /&gt;
#/sbin/iptables -I FORWARD -i eno1 -o enp11s0 -m state --state RELATED,ESTABLISHED -j ACCEPT&lt;br /&gt;
#/sbin/iptables -I FORWARD -i enp11s0 -o eno1 -j ACCEPT&lt;br /&gt;
#iptables -L -v&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
sysctl -w net.ipv4.ip_forward=1&lt;br /&gt;
#sysctl -a | grep forward&lt;br /&gt;
&lt;br /&gt;
sh /etc/firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* emacs -nw /etc/firewall-rfc1918.sh&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# firewall-rfc1918.sh&lt;br /&gt;
&lt;br /&gt;
# prevent RFC1918 private network IP addresses from&lt;br /&gt;
# going in and out from our uplink.&lt;br /&gt;
&lt;br /&gt;
ETH=eno1&lt;br /&gt;
&lt;br /&gt;
iptables -F in-rfc1918&lt;br /&gt;
iptables -N in-rfc1918&lt;br /&gt;
iptables -A in-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A in-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -D INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
iptables -I INPUT -j in-rfc1918 -i $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -F out-rfc1918&lt;br /&gt;
iptables -N out-rfc1918&lt;br /&gt;
iptables -A out-rfc1918 --dst 10.0.0.0/8      -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 172.16.0.0/12   -j REJECT&lt;br /&gt;
iptables -A out-rfc1918 --dst 192.168.0.0/16  -j REJECT&lt;br /&gt;
&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -D OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
iptables -I OUTPUT -j out-rfc1918 -o $ETH&lt;br /&gt;
&lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -D FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
iptables -I FORWARD -j out-rfc1918 -o $ETH &lt;br /&gt;
&lt;br /&gt;
# allow TRIUMF-SECURE network&lt;br /&gt;
&lt;br /&gt;
iptables -I in-rfc1918 -s 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
iptables -I out-rfc1918 -d 10.90.0.0/255.255.0.0 -j ACCEPT &lt;br /&gt;
&lt;br /&gt;
# show configuration&lt;br /&gt;
&lt;br /&gt;
iptables -L -v&lt;br /&gt;
&lt;br /&gt;
#end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= KVM =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install cpu-checker&lt;br /&gt;
&lt;br /&gt;
root@daq13:~# kvm-ok &lt;br /&gt;
INFO: /dev/kvm exists&lt;br /&gt;
KVM acceleration can be used&lt;br /&gt;
root@daq13:~# &lt;br /&gt;
&lt;br /&gt;
(if not, shutdown, go into BIOS settings, enable CPU virtualization)&lt;br /&gt;
&lt;br /&gt;
apt install virtinst ### will install many packages&lt;br /&gt;
apt install libvirt-clients libvirt-daemon-system-systemd libvirt-daemon qemu qemu-kvm libvirt-daemon-system virtinst bridge-utils&lt;br /&gt;
&lt;br /&gt;
root@daq13:/home1/wheel# virsh list --all&lt;br /&gt;
 Id   Name           State&lt;br /&gt;
------------------------------&lt;br /&gt;
 1    ubuntu-guest   running&lt;br /&gt;
&lt;br /&gt;
apt install virt-manager&lt;br /&gt;
&lt;br /&gt;
virt-install --name ubuntu-guest --os-variant ubuntu20.04 --vcpus 2 --ram 2048 --location /daq/daqstore/olchansk/linux/Ubuntu/ubuntu-20.04.3-desktop-amd64.iso --network bridge=virbr0,model=virtio --graphics none --extra-args=&#039;console=ttyS0,115200n8 serial&#039;&lt;br /&gt;
&lt;br /&gt;
virtual machine will start, boot, etc&lt;br /&gt;
to get out of it, CTRL + Shift followed by ]&lt;br /&gt;
&lt;br /&gt;
ssh wheel@daq13&lt;br /&gt;
virt-manager&lt;br /&gt;
&lt;br /&gt;
run virt-install again, omit &amp;quot;--graphics none&amp;quot;, open graphics console from virt-manager, it booted into ubuntu installer desktop&lt;br /&gt;
&lt;br /&gt;
virt-install --name test10 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --filesystem /kvm_ladd00,/ --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial&amp;quot; --graphics none&lt;br /&gt;
&lt;br /&gt;
virt-install --name test14 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --disk /tmp/xxx/ladd00.img,bus=sata --network bridge=virbr0,model=virtio --boot kernel=/kvm_ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm_ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64.img,kernel_args=&amp;quot;root=/dev/sda console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
build image&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=/dev/zero of=/tmp/xxx/ladd00.img bs=1024M count=20&lt;br /&gt;
mkfs.ext3 /tmp/xxx/ladd00.img ### ext4 fails to mount by SL6 kernel, &amp;quot;unknown ext4 options&amp;quot;&lt;br /&gt;
cd /kvm_ladd00/&lt;br /&gt;
mount -o loop /tmp/xxx/ladd00.img /mnt/tmp&lt;br /&gt;
rsync -av . /mnt/tmp/ --delete&lt;br /&gt;
umount /mnt/tmp&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
on the guest, configure network: /etc/rc.local&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
#&lt;br /&gt;
# This script will be executed *after* all the other init scripts.&lt;br /&gt;
# You can put your own initialization stuff in here if you don&#039;t&lt;br /&gt;
# want to do the full Sys V style init stuff.&lt;br /&gt;
&lt;br /&gt;
touch /var/lock/subsys/local&lt;br /&gt;
&lt;br /&gt;
ifconfig eth2 192.168.122.2&lt;br /&gt;
route add -net 0.0.0.0 gw 192.168.122.1&lt;br /&gt;
ifconfig -a&lt;br /&gt;
netstat -rn&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== virsh commands ==&lt;br /&gt;
&lt;br /&gt;
* virsh list --all&lt;br /&gt;
&lt;br /&gt;
== virtualize SL6 ladd00 ==&lt;br /&gt;
&lt;br /&gt;
* on ladd00:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
mkinitrd /boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img 2.6.32-754.35.1.el6.x86_64&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-ladd00&lt;br /&gt;
cd /kvm-ladd00&lt;br /&gt;
rsync -avx ladd00:/ . --exclude nfsroot&lt;br /&gt;
brctl addbr virbr0&lt;br /&gt;
ifconfig virbr0 192.168.1.1&lt;br /&gt;
echo /kvm-ladd00 192.168.1.2(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-ladd00 --os-variant centos6.10 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=virtio --boot kernel=/kvm-ladd00/boot/vmlinuz-2.6.32-754.35.1.el6.x86_64,initrd=/kvm-ladd00/boot/initramfs-2.6.32-754.35.1.el6.x86_64-netboot.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.2:192.168.1.1:192.168.1.1:255.255.255.0:ladd00::off nfsroot=192.168.1.1:/kvm-ladd00,vers=3,tcp console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-ladd00 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
== virtualize CentOS-7 daqstore ==&lt;br /&gt;
&lt;br /&gt;
* similar to ladd00 above:&lt;br /&gt;
* on daqstore, install dracut-network, already there&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
yum install dracut-network&lt;br /&gt;
yum install qemu-kvm libvirt libvirt-python libguestfs-tools virt-install&lt;br /&gt;
# yum install busybox ### no rpm package?!?&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dracut -a nfs -v /boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img 3.10.0-1160.119.1.el7.x86_64 --force&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
scp daqstore:/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img /kvm-el7/boot/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* on daq00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs create rpool/kvm-el7&lt;br /&gt;
cd /kvm-el7&lt;br /&gt;
rsync -avx daqstore:/ .&lt;br /&gt;
echo 192.168.1.3 kvm-el7 &amp;gt;&amp;gt; /etc/hosts&lt;br /&gt;
systemctl restart dnsmasq&lt;br /&gt;
echo /kvm-el 192.168.1.3(rw,no_root_squash,no_all_squash,async,no_subtree_check) &amp;gt;&amp;gt; /etc/exports&lt;br /&gt;
exportfs -rv&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* manage virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virsh console kvm-el7&lt;br /&gt;
virsh destroy kvm-el7&lt;br /&gt;
virsh undefine kvm-el7&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create virtual machine&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
virt-install --name kvm-el7 --os-variant centos7 --vcpus 2 --ram 2048 --import --network bridge=virbr0,model=e1000e --boot kernel=/kvm-el7/boot/vmlinuz-3.10.0-1160.119.1.el7.x86_64,initrd=/kvm-el7/boot/initramfs-3.10.0-1160.119.1.el7.x86_64-virt.img,kernel_args=&amp;quot;root=/dev/nfs ip=192.168.1.3:192.168.1.1:192.168.1.1:255.255.255.0:kvm-el7::off nfsroot=192.168.1.1:/kvm-el7,vers=3,tcp rw console=ttyS0,115200n8 serial rdshell&amp;quot; --graphics none --nodisks --check path_in_use=off&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* adjust kvm-el7 image&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
disable network manager&lt;br /&gt;
edit fstab&lt;br /&gt;
edit hostname&lt;br /&gt;
disable selinux in /etc/sysconfig/selinux&lt;br /&gt;
&lt;br /&gt;
UP TO HERE --- DNS does not work!!!&lt;br /&gt;
&lt;br /&gt;
edit yp.conf&lt;br /&gt;
edit resolv.conf&lt;br /&gt;
edit root/.ssh/authorized_keys&lt;br /&gt;
enable rngd or /dev/random does not work, sshd does not work&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* virsh shutdown test24&lt;br /&gt;
* virsh --connect qemu:///system start test24&lt;br /&gt;
* virsh console test24 ### to exit, ctrl+[ or ctrl+]&lt;br /&gt;
* virsh undefine test24&lt;br /&gt;
* virsh autostart kvm-ladd00&lt;br /&gt;
* virsh dominfo kvm-ladd00&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daq00:~# virsh dominfo kvm-ladd00&lt;br /&gt;
Id:             1&lt;br /&gt;
Name:           kvm-ladd00&lt;br /&gt;
UUID:           1d1f8fed-8b65-4411-a51b-e0ecf359d2f1&lt;br /&gt;
OS Type:        hvm&lt;br /&gt;
State:          running&lt;br /&gt;
CPU(s):         2&lt;br /&gt;
CPU time:       27.7s&lt;br /&gt;
Max memory:     2097152 KiB&lt;br /&gt;
Used memory:    2097152 KiB&lt;br /&gt;
Persistent:     yes&lt;br /&gt;
Autostart:      enable&lt;br /&gt;
Managed save:   no&lt;br /&gt;
Security model: apparmor&lt;br /&gt;
Security DOI:   0&lt;br /&gt;
Security label: libvirt-1d1f8fed-8b65-4411-a51b-e0ecf359d2f1 (enforcing)&lt;br /&gt;
root@daq00:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* delete unused images in /var/lib/libvirt/images&lt;br /&gt;
* virsh edit kvm-ladd00 # change boot command line, etc&lt;br /&gt;
&lt;br /&gt;
= ARM64 cross-compiler =&lt;br /&gt;
&lt;br /&gt;
* arm64, aarch64 are Xilinx FPGA Cortex-A53, RPi4, RPi5 machines&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-12-aarch64-linux-gnu gcc-12-aarch64-linux-gnu-base libstdc++-12-dev-arm64-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
aarch64-linux-gnu-gcc-12 -o ttcp.aarch64 ttcp.c -static&lt;br /&gt;
aarch64-linux-gnu-g++-12 -o fecdm.exe -O2 -g -Wall -Wuninitialized -std=c++20 fecdm.o dsdm.o /home/dsdaqdev/packages_common/midas/linux-aarch64-remoteonly/lib/libmidas.a -pthread -lrt -lutil /nfsroot/gdm00/usr/lib/aarch64-linux-gnu/libi2c.a -static&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= ARM cross-compiler =&lt;br /&gt;
&lt;br /&gt;
NOTE: updated for U-24&lt;br /&gt;
&lt;br /&gt;
* armv7 (Cyclone-V SoC, RPi3, MityARM CAMAC) machines (Debian-12 armhf target, Ubuntu 24.04 host)&lt;br /&gt;
* install packages:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install g++-arm-linux-gnueabihf gcc-arm-linux-gnueabihf libc6-dev-armhf-cross&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* build MIDAS frontend (static linking)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
arm-linux-gnueabihf-g++ -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb -c koi2c.cxx&lt;br /&gt;
arm-linux-gnueabihf-g++ -o fedldb.exe -std=c++11 -Wall -Wuninitialized -g -O2 -I/home/dldaq/packages/midas/include -I/home/dldaq/packages/midas/mvodb fedldb.o koi2c.o /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a -L/usr/arm-linux-gnueabihf/lib -L/nfsroot/dltdc/usr/lib/arm-linux-gnueabihf -static -lm -lz -lutil -lnsl -lpthread -lrt -li2c&lt;br /&gt;
/usr/lib/gcc-cross/arm-linux-gnueabihf/13/../../../../arm-linux-gnueabihf/bin/ld: /home/dldaq/packages/midas/linux-armv7-remoteonly/lib/libmidas.a(system.o): in function `ss_socket_connect_tcp(char const*, int, int*, std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;*)&#039;:&lt;br /&gt;
/home/dldaq/packages/midas/src/system.cxx:4984:(.text+0x252a): warning: Using &#039;getaddrinfo&#039; in statically linked applications requires at runtime the shared libraries from the glibc version used for linking&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 32-bit intel cross-compiler =&lt;br /&gt;
&lt;br /&gt;
Ubuntu 22.04:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install libstdc++-11-dev:i386&lt;br /&gt;
apt install zlib1g-dev:i386&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
NOTES:&lt;br /&gt;
* &amp;quot;g++ -m32&amp;quot; does not find libstdc++, please use &amp;quot;g++ -m32 -L/usr/lib/gcc/i686-linux-gnu/11/&amp;quot;&lt;br /&gt;
* to cross-build 32-bit MIDAS, use &amp;quot;make linux32&amp;quot;.&lt;br /&gt;
* executables cross-build on Ubuntu-22 do NOT run on 32-bit Debain-11 (GLIBC and GLIBCXX version mismatch)&lt;br /&gt;
* executables cross-build on Ubuntu-22 run on 32-bit Debian-12.&lt;br /&gt;
&lt;br /&gt;
= SSH settings for EPICS =&lt;br /&gt;
&lt;br /&gt;
* TRIUMF EPICS runs obsolete version of SSH&lt;br /&gt;
* add this to the use .ssh/config&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host sbp1*&lt;br /&gt;
HostKeyAlgorithms +ssh-rsa&lt;br /&gt;
PubKeyAcceptedAlgorithms +ssh-rsa&lt;br /&gt;
KexAlgorithms +diffie-hellman-group1-sha1&lt;br /&gt;
ForwardX11 yes&lt;br /&gt;
ForwardX11Trusted yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= changes for VME processors =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y remove sysstat man-db&lt;br /&gt;
apt -y purge dkms&lt;br /&gt;
apt -y purge mdadm&lt;br /&gt;
apt -y purge fwupd&lt;br /&gt;
apt -y purge packagekit&lt;br /&gt;
apt -y purge accountsservice&lt;br /&gt;
apt -y purge plocate&lt;br /&gt;
apt -y purge upower power-profiles-daemon&lt;br /&gt;
apt -y autoremove&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
for D-12 32-bit CPUs:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove &amp;quot;*libavahi*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= remove snap (U-24) =&lt;br /&gt;
&lt;br /&gt;
Note: snap stores data in $USER/snap/$SNAPNAME, removing a snap on one machine will remove this data from all users even if they want to use snap on some other machine.&lt;br /&gt;
&lt;br /&gt;
Prepare:&lt;br /&gt;
&lt;br /&gt;
NOTE: first remove chromium and firefox, see below.&lt;br /&gt;
&lt;br /&gt;
NOTE: if possible, stop autofs before removing snap - otherwise it will mount all user home directories and complain that it cannot remove some snap data from them&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
systemctl stop autofs&lt;br /&gt;
ls -ld /home1/*/snap/* ### remove the per-user snap directories&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap list&lt;br /&gt;
echo snap remove --purge chromium ### see below&lt;br /&gt;
echo snap remove --purge firefox ### see below&lt;br /&gt;
snap remove thunderbird&lt;br /&gt;
snap remove cups&lt;br /&gt;
snap remove hello-world&lt;br /&gt;
snap remove firmware-updater&lt;br /&gt;
snap remove gtk-common-themes&lt;br /&gt;
snap remove snapd-desktop-integration&lt;br /&gt;
snap remove snap-store&lt;br /&gt;
snap remove hunspell-dictionaries-1-7-2004&lt;br /&gt;
snap remove gnome-system-monitor&lt;br /&gt;
snap remove gnome-3-26-1604&lt;br /&gt;
snap remove gnome-3-28-1804&lt;br /&gt;
snap remove gnome-3-34-1804&lt;br /&gt;
snap remove gnome-3-38-2004&lt;br /&gt;
snap remove gnome-42-2204&lt;br /&gt;
snap remove gnome-46-2404&lt;br /&gt;
snap remove mesa-2404&lt;br /&gt;
snap remove core&lt;br /&gt;
snap remove core18&lt;br /&gt;
snap remove core20&lt;br /&gt;
snap remove core22&lt;br /&gt;
snap remove core24&lt;br /&gt;
snap remove bare&lt;br /&gt;
snap remove snapd&lt;br /&gt;
snap list&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@daqubuntu:~# snap list&lt;br /&gt;
No snaps are installed yet. Try &#039;snap install hello-world&#039;.&lt;br /&gt;
root@daqubuntu:~# &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Identify packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt list | grep snap | grep installed | grep -v -e snappy -e snapshot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Typical output:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
firefox/noble,now 1:1snap1-0ubuntu5 amd64 [installed]&lt;br /&gt;
gir1.2-snapd-2/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-glib-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
libsnapd-qt-2-1/noble,now 1.64-0ubuntu5 amd64 [installed,automatic]&lt;br /&gt;
plasma-discover-backend-snap/noble,now 5.27.11-0ubuntu2 amd64 [installed]&lt;br /&gt;
snapd/noble-updates,now 2.66.1+24.04 amd64 [installed]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove packages that install snaps:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt remove chromium-browser&lt;br /&gt;
apt remove chromium-codecs-ffmpeg-extra&lt;br /&gt;
apt remove thunderbird&lt;br /&gt;
apt remove firefox&lt;br /&gt;
apt remove plasma-discover-backend-snap&lt;br /&gt;
apt remove plasma-discover-snap-backend&lt;br /&gt;
apt remove snapd&lt;br /&gt;
apt purge  snapd&lt;br /&gt;
# package gir1.2-snapd-2 is required by ubuntu-mate-desktop &amp;amp; co&lt;br /&gt;
# libsnapd-glib-2-1 is required by gstreamer, gnome-remote-desktop &amp;amp; co&lt;br /&gt;
ls -l /etc/systemd/system/ | grep snap ### remove unwanted stuff&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Remove Chromium:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/chromium/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/chromium/*`&lt;br /&gt;
* snap remove chromium&lt;br /&gt;
&lt;br /&gt;
Remove Firefox:&lt;br /&gt;
&lt;br /&gt;
* ls -ld /home/*/snap/firefox/*&lt;br /&gt;
* echo /bin/rm -rf `ls -1d /home/*/snap/firefox/*` ### this will delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
* snap remove firefox ### this will also delete &amp;quot;snap firefox&amp;quot; profiles of all users!!!&lt;br /&gt;
&lt;br /&gt;
Remove gir1.2-snapd-2:&lt;br /&gt;
* echo rm -vf /usr/lib/x86_64-linux-gnu/girepository-1.0/Snapd-2.typelib&lt;br /&gt;
&lt;br /&gt;
If &amp;quot;snap remove&amp;quot; is stuck in &amp;quot;change in progress&amp;quot; (this will remove all snaps and break snapd, which is ok, &lt;br /&gt;
see https://forum.snapcraft.io/t/snap-remove-taking-forever-abort-wasnt-working/48915)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
rm /var/lib/snapd/state.json&lt;br /&gt;
systemctl restart snapd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Prevent snap from reinstalling:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts/etc&lt;br /&gt;
git pull&lt;br /&gt;
cp etc-apt-preferencesd-disable-snap /etc/apt/preferences.d/&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= install non-snap thunderbird =&lt;br /&gt;
&lt;br /&gt;
from: https://ubuntuhandbook.org/index.php/2024/03/install-thunderbird-deb-ubuntu-2404/&lt;br /&gt;
&lt;br /&gt;
* remove snap thunderbird&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
snap remove --purge thunderbird&lt;br /&gt;
apt remove --purge thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add mozilla repository&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
already done after installing firefox-esr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* ppa deb and ubuntu snap thunderbird package names are the same, change priority and hide snap package: create /etc/apt/preferences.d/mozillateamppa&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=LP-PPA-mozillateam&lt;br /&gt;
Pin-Priority: 1001&lt;br /&gt;
&lt;br /&gt;
Package: thunderbird*&lt;br /&gt;
Pin: release o=Ubuntu&lt;br /&gt;
Pin-Priority: -1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that it worked, it should say &amp;quot;build&amp;quot; instead of &amp;quot;snap&amp;quot;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt update&lt;br /&gt;
apt list | grep thunderbird | grep -v locale&lt;br /&gt;
...&lt;br /&gt;
thunderbird/noble 1:128.8.1+build1-0ubuntu0.24.04.1~mt1 amd64&lt;br /&gt;
...&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install thunderbird&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* run: thunderbird&lt;br /&gt;
&lt;br /&gt;
= EFI boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* rationale 1: GRUB is the stock boot loader with U-24. It is unnecessarily complicated. EFI BIOS can boot the linux kernel directly, without GRUB, but unfortunately a small shim bootloader is required to specify the initrd file and the root filesystem. the syslinux boot loader can do this in a very simple way.&lt;br /&gt;
* rationale 2: GRUB bootloader configuration is overcomplicated, and when it breaks, it is almost impossible to debug and to recover.&lt;br /&gt;
* rationale 3: GRUB bootloader scripts in U-24 have no support for booting from redundant SSDs.&lt;br /&gt;
* in the case of GRUB bootloader failure, it is simplest to boot the Ubuntu installer in recovery mode and convert the bootloader from GRUB to syslinux. Open firefox on this page and cut-and-paste the steps (only copy of vmlinux and initrd cannot copy-and-paste as of this writing).&lt;br /&gt;
* in the case of servers with redundant SSDs for OS and home directories (ZFS mirror), it is simplest to use the syslinux bootloader to ensure that the machine boots from either SSD (all combinations SSD failures, fail of either EFI partiion, fail of either ZFS mirror partition, machine should boot)&lt;br /&gt;
* check partition tables, SATA SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/sda&lt;br /&gt;
Disk /dev/sda: 232.89 GiB, 250059350016 bytes, 488397168 sectors&lt;br /&gt;
Disk model: WD Blue SA510 2.&lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 512 bytes&lt;br /&gt;
I/O size (minimum/optimal): 512 bytes / 512 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: A3F34DAC-DCB4-B74C-B59E-41E754807812&lt;br /&gt;
&lt;br /&gt;
Device       Start       End   Sectors   Size Type&lt;br /&gt;
/dev/sda1     2048   1050623   1048576   512M EFI System&lt;br /&gt;
/dev/sda2  1050624   5244927   4194304     2G Linux swap&lt;br /&gt;
/dev/sda3  5244928   9439231   4194304     2G Solaris boot&lt;br /&gt;
/dev/sda4  9439232 488397134 478957903 228.4G Solaris root&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check partition tables, NVME SSD&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
fdisk -l /dev/nvme0n1&lt;br /&gt;
Disk /dev/nvme0n1: 1.75 TiB, 1920383410176 bytes, 3750748848 sectors&lt;br /&gt;
Disk model: SAMSUNG MZ1L21T9HCLS-00A07              &lt;br /&gt;
Units: sectors of 1 * 512 = 512 bytes&lt;br /&gt;
Sector size (logical/physical): 512 bytes / 4096 bytes&lt;br /&gt;
I/O size (minimum/optimal): 131072 bytes / 131072 bytes&lt;br /&gt;
Disklabel type: gpt&lt;br /&gt;
Disk identifier: 04ECCD46-DC2A-454C-B4A8-CCC18AA532F7&lt;br /&gt;
&lt;br /&gt;
Device            Start        End    Sectors  Size Type&lt;br /&gt;
/dev/nvme0n1p1     2048    2203647    2201600    1G EFI System&lt;br /&gt;
/dev/nvme0n1p2  2203648    6397951    4194304    2G Linux filesystem&lt;br /&gt;
/dev/nvme0n1p3  6397952   23175167   16777216    8G Linux swap&lt;br /&gt;
/dev/nvme0n1p4 23175168 3750746111 3727570944  1.7T Linux filesystem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, SATA SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/sda1&lt;br /&gt;
mkfs.msdos /dev/sdb1&lt;br /&gt;
mkdir /boot/efi-sda&lt;br /&gt;
mkdir /boot/efi-sdb&lt;br /&gt;
mount /dev/sda1 /boot/efi-sda&lt;br /&gt;
mount /dev/sdb1 /boot/efi-sdb&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare boot device EFI partition, NVME SSDs&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.msdos /dev/nvme0n1p1&lt;br /&gt;
mkfs.msdos /dev/nvme1n1p1&lt;br /&gt;
mkdir /boot/efi-0&lt;br /&gt;
mkdir /boot/efi-1&lt;br /&gt;
mount /dev/nvme0n1p1 /boot/efi-0&lt;br /&gt;
mount /dev/nvme1n1p1 /boot/efi-1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* add them to fstab, note the &amp;quot;nofail&amp;quot; mount option&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
blkid | grep vfat&lt;br /&gt;
/dev/sdb1: UUID=&amp;quot;F30C-13B5&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;20e423b5-ac29-ec42-bab5-f366aefbbd2b&amp;quot;&lt;br /&gt;
/dev/sda1: UUID=&amp;quot;F2DD-7321&amp;quot; BLOCK_SIZE=&amp;quot;512&amp;quot; TYPE=&amp;quot;vfat&amp;quot; PARTUUID=&amp;quot;9427646c-ce5f-fe47-9ed1-4b84cf4c348f&amp;quot;&lt;br /&gt;
grep ^UUID /etc/fstab&lt;br /&gt;
UUID=F2DD-7321  /boot/efi-sda       vfat    umask=0022,fmask=0022,dmask=0022,nofail      0       1&lt;br /&gt;
UUID=F30C-13B5  /boot/efi-sdb       vfat    umask=0022,fmask=0022,dmask=0022.nofail      0       1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* prepare the EFI partitions (remove old previous subdirectories, only empty efi/boot should be there)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda&lt;br /&gt;
mkdir -p efi/boot&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* get syslinux-6.03&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~&lt;br /&gt;
wget https://daq00.triumf.ca/~olchansk/linux/syslinux-6.03.tar.xz&lt;br /&gt;
xz -d &amp;lt; syslinux-6.03.tar.xz | tar xvf -&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* from syslinux-6.03 copy files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd /boot/efi-sda/efi/boot&lt;br /&gt;
cp ~/syslinux-6.03/efi64/efi/syslinux.efi .&lt;br /&gt;
cp ~/syslinux-6.03/efi64/com32/elflink/ldlinux/ldlinux.e64 .&lt;br /&gt;
cp syslinux.efi bootx64.efi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* identify the ZFS rpool label&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;&lt;br /&gt;
rpool/ROOT/ubuntu_9yvb17&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* create syslinux.cfg, change the root=ZFS label to match this computer&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cat &amp;lt;&amp;lt; EOF | sed &amp;quot;s;root=.*$;root=ZFS=`zfs list | grep ROOT | grep &amp;quot;/$&amp;quot; | cut -f1 -d&amp;quot; &amp;quot;`;&amp;quot; &amp;gt; syslinux.cfg&lt;br /&gt;
default linux&lt;br /&gt;
label linux&lt;br /&gt;
kernel vmlinuz&lt;br /&gt;
append ro initrd=initrd.img root=ZFS=rpool/ROOT/ubuntu_02ruwj&lt;br /&gt;
EOF&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* copy linux boot files:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cp /boot/vmlinuz vmlinuz&lt;br /&gt;
cp /boot/initrd.img initrd.img&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* repeat with /boot/efi-sdb, etc&lt;br /&gt;
* install script to set syslinux to boot the latest kernel&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
cd ~/git/scripts&lt;br /&gt;
git pull&lt;br /&gt;
ln -s ~/git/scripts/etc/update_efi_syslinux.perl ~&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* update syslinux to boot the latest kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl&amp;quot; to check that it finds the EFI partitions and finds the correct kernel&lt;br /&gt;
** run &amp;quot;~/update_efi_syslinux.perl -u&amp;quot; to do the actual update&lt;br /&gt;
* or maybe install Ubuntu syslinux 6.04 and use files from there:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt install &amp;quot;syslinux*&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= legacy boot using syslinux =&lt;br /&gt;
&lt;br /&gt;
* NOTE: extlinux is not compatible with ext4 &amp;quot;64bit&amp;quot; feature, it should be turned off:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
mkfs.ext4 -O ^64bit /dev/sdX1&lt;br /&gt;
resize2fs -s /dev/sdX1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux (THIS DOES NOT WORK!!!)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
apt -y install syslinux extlinux&lt;br /&gt;
dd if=/usr/lib/syslinux/mbr/mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
cd /boot&lt;br /&gt;
cp /usr/lib/syslinux/modules/bios/menu.c32 .&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install syslinux and extlinux&lt;br /&gt;
&lt;br /&gt;
* copy from old SL6 USB disk (this is extlinux 6.02)&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
root@localhost:/boot# ls -l&lt;br /&gt;
-rwxr-xr-x 1 root root   218952 Jan 28 17:40 extlinux&lt;br /&gt;
-rw-r--r-- 1 root root      402 Jan 29 14:45 extlinux.conf&lt;br /&gt;
-rw-r--r-- 1 root root      496 Jan 29 14:39 extlinux.conf~&lt;br /&gt;
-r--r--r-- 1 root root   122044 Jan 29 14:39 ldlinux.c32&lt;br /&gt;
-r--r--r-- 1 root root    67072 Jan 29 14:39 ldlinux.sys&lt;br /&gt;
-rwxr-xr-x 1 root root    24156 Jan 28 17:40 libutil.c32&lt;br /&gt;
-rw-r--r-- 1 root root      304 Jan 28 17:40 mbr.bin&lt;br /&gt;
-rw-r--r-- 1 root root    26140 Jan 28 17:40 memdisk&lt;br /&gt;
-rw-r--r-- 1 root root    69043 Jan 28 17:40 memtest86+-4.20.iso.zip&lt;br /&gt;
-rw-r--r-- 1 root root   183012 Jan 28 17:40 memtest86+-5.01&lt;br /&gt;
-rw-r--r-- 1 root root    26568 Jan 28 17:40 menu.c32&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* install&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dd if=mbr.bin of=/dev/sdX ### NOT /dev/sdX1 NOT !!!&lt;br /&gt;
extlinux -i .&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
* check that partition /dev/sdX1 is marked bootable (fdisk command &amp;quot;a&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
* create /boot/extlinux.conf&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DEFAULT menu.c32&lt;br /&gt;
PROMPT 0&lt;br /&gt;
TIMEOUT 50&lt;br /&gt;
&lt;br /&gt;
MENU TITLE TRIUMF DAQ USB BOOT32 ver K.O. 2025jan28&lt;br /&gt;
&lt;br /&gt;
LABEL linux&lt;br /&gt;
  MENU DEFAULT&lt;br /&gt;
  kernel /vmlinuz&lt;br /&gt;
  append initrd=/initrd.img panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL linux-6.1.0-28-686&lt;br /&gt;
  kernel vmlinuz-6.1.0-28-686&lt;br /&gt;
  append initrd=initrd.img-6.1.0-28-686 panic=60 rootdelay=5 rootwait rw root=/dev/sda1&lt;br /&gt;
&lt;br /&gt;
LABEL memtest&lt;br /&gt;
  kernel memtest86+-1.65&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Add user to login spash screen =&lt;br /&gt;
&lt;br /&gt;
For user login to local machine, if it doesn&#039;t work by default. User should exist already from NIS service.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sudo /bin/bash # as root&lt;br /&gt;
cd /var/lib/AccountsService/users&lt;br /&gt;
ls # should at least display the &amp;quot;wheel&amp;quot; user&lt;br /&gt;
cp wheel username # we&#039;re going to copy the user account settings over to our new user&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Olchansk</name></author>
	</entry>
</feed>